&НаКлиенте
Перем мОбычныеПрикладныеОбъекты;

&НаКлиенте
Перем мТекущийОбъектДерева;

&НаКлиенте
Перем мОписаниеПравДоступа;

&НаКлиенте
Перем мИдентификаторИзбранного;

&НаКлиенте
Перем мПараметрыКластера1С;
&НаСервере
Функция вПолучитьОбработку()
	Возврат РеквизитФормыВЗначение("Объект");
КонецФункции
&НаКлиенте
Процедура вПоказатьПредупреждение(Текст)
	ПоказатьПредупреждение( , Текст, 20);
КонецПроцедуры

&НаКлиенте
Процедура вПоказатьВопрос(ТекстВопроса, ИмяПроцедуры, ДопПараметры = Неопределено)
	ПоказатьВопрос(Новый ОписаниеОповещения(ИмяПроцедуры, ЭтаФорма, ДопПараметры), ТекстВопроса,
		РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура вОперацияНеПоддерживаетсяДляВебКлиента()
	вПоказатьПредупреждение("Для Web-клиента данная операция не поддерживается!");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура вЗаполнитьКонтекстФормы(СтрукКонтекст)
	СтрукКонтекст.Вставить("ВерсииПодсистем", (Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено));
	СтрукКонтекст.Вставить("МонопольныйРежим", МонопольныйРежим());
КонецПроцедуры

&НаСервереБезКонтекста
Функция вЕстьПраваАдминистратора()
	Возврат ПравоДоступа("Администрирование", Метаданные);
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьИдентификаторПользователя(Знач Имя)
	пПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(Имя);

	Возврат ?(пПользователь = Неопределено, "", Строка(пПользователь.УникальныйИдентификатор));
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция вЗначениеВМассив(Знач Значение)
	Массив = Новый Массив;
	Массив.Добавить(Значение);

	Возврат Массив;
КонецФункции

&НаСервере
Процедура УстановитьУсловноеОформление()
	ЭтаФорма.УсловноеОформление.Элементы.Очистить();

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоОбъектов.ПолноеИмя");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Конфигурация";
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ДеревоСервис.Шрифт, , , Истина));
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ДеревоОбъектовИмя");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоОбъектов.ТипУзла");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = 1;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.ТемноСиний);
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ДеревоОбъектовИмя");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоСервис.ЭтоГруппа");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ДеревоСервис.Шрифт, , , Истина));
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ДеревоСервисПредставление");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоСервис.Доступность");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Ложь;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Новый Цвет(83, 106, 194));
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ДеревоСервисПредставление");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТабПроверяемыеПрава.Пометка");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(Элементы.ТабПроверяемыеПрава.Шрифт, , ,
		Истина));
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ТабПроверяемыеПраваОбъектМД");
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("ТабПроверяемыеПраваПраво");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("_СписокСеансов.ТекущийСеанс");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("_СписокСеансов");

	ЭлементУО = ЭтаФорма.УсловноеОформление.Элементы.Добавить();
	ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("_СписокСоединений.ТекущееСоединение");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = Истина;
	ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Синий);
	ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("_СписокСоединений");

КонецПроцедуры

&НаКлиенте
Функция вСформироватьСтруктуруНастроекФормыСвойствОбъекта()
	Струк = Новый Структура("_ПоказыватьПодпискиОбъекта, _ПоказыватьПодсистемыОбъекта, _ПоказыватьОбщиеКомандыОбъекта, _ПоказыватьЧужиеКомандыОбъекта, _ПоказыватьСтруктуруХраненияВТерминах1С");
	ЗаполнитьЗначенияСвойств(Струк, ЭтаФорма);

	Возврат Струк;
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ПутьКФормам = вПолучитьОбработку().Метаданные().ПолноеИмя() + ".Форма.";

	пЕстьПраваАдминистратора = вЕстьПраваАдминистратора();
	ВремяОжиданияЗапускаПодПользователемПередВосстановлениемПароля=20;
	
	//Элементы.СтрНастройки.Видимость = ложь;
	Элементы.СтрСтруктураХранения.Видимость = Ложь;
	Элементы.СтраницыПраваНаОбъект.Видимость = Ложь;
	Элементы._ОтображатьПраваНаОбъекты.Доступность = пЕстьПраваАдминистратора;
	Элементы.ДеревоОбъектовАдминистраторам.Доступность = пЕстьПраваАдминистратора;
	Элементы.СтрПользователиИБ.Видимость = пЕстьПраваАдминистратора;
	Элементы._СписокСеансов_ЗавершитьСеансы.Доступность = пЕстьПраваАдминистратора;
	Элементы.СтрСеансы.Видимость = ПравоДоступа("АктивныеПользователи", Метаданные);
	Элементы._СписокСеансов_ЗавершитьСеансы.Доступность = пЕстьПраваАдминистратора;

	Элементы.СтрРасширенияКонфигурации.Видимость = Ложь;
	//Элементы.СтрРасширенияКонфигурации.Видимость = вПроверитьНаличиеТипа("РасширениеКонфигурации");

	_КонтекстФормы = Новый Структура;
	вЗаполнитьКонтекстФормы(_КонтекстФормы);
	вЗаполнитьДеревоСервис();

	_СодержимоеИзбранного = Новый Структура("Версия, Данные", 1, Новый Массив);

	УстановитьУсловноеОформление();

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка,
		Элементы.ДеревоОбъектов.КоманднаяПанель);

КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	Если _ПоказыватьСтандартныеНастройки Тогда
		Элементы.СтрСтандартныеНастройки.Видимость = Истина;
	КонецЕсли;

	Если _ПоказыватьТаблицыИИндексыБД Тогда
		Элементы.СтрСтруктураХранения.Видимость = Истина;
	КонецЕсли;

	Значение = Настройки["_СодержимоеИзбранного"];
	Если Значение <> Неопределено Тогда
		Если Не Значение.Свойство("Версия") Тогда
			Значение.Вставить("Версия", 1);
		КонецЕсли;
		_СодержимоеИзбранного = Значение;

		СтрокиДЗ = ДеревоОбъектов.ПолучитьЭлементы();
		Если СтрокиДЗ.Количество() <> 0 Тогда
			// перезаполним избранное
			Для Каждого РазделДЗ Из СтрокиДЗ Цикл
				Если РазделДЗ.ПолноеИмя = "Избранное" Тогда
					РазделДЗ.ПолучитьЭлементы().Очистить();
					Для Каждого Элем Из _СодержимоеИзбранного.Данные Цикл
						ЗаполнитьЗначенияСвойств(РазделДЗ.ПолучитьЭлементы().Добавить(), Элем);
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	Элементы._СписокПользователейИБПереченьРолей.Видимость = _ПоказыватьСписокРолейПользователя;
КонецПроцедуры

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	// сформируем избранное
	Для Каждого РазделДЗ Из ДеревоОбъектов.ПолучитьЭлементы() Цикл
		Если РазделДЗ.ПолноеИмя = "Избранное" Тогда
			ПереченьПолейУзлаДЗ = вПереченьПолейУзлаДЗ();
			_СодержимоеИзбранного.Данные.Очистить();
			Для Каждого СтрДЗ Из РазделДЗ.ПолучитьЭлементы() Цикл
				Струк = Новый Структура(ПереченьПолейУзлаДЗ);
				ЗаполнитьЗначенияСвойств(Струк, СтрДЗ);
				_СодержимоеИзбранного.Данные.Добавить(Струк);
			КонецЦикла;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Настройки.Вставить("_СодержимоеИзбранного", _СодержимоеИзбранного);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	мТекущийОбъектДерева = "";

	вСформироватьОписаниеПравДоступа();
	вЗаполнитьПроверяемыеПраваДоступа();

	мОбычныеПрикладныеОбъекты = Новый Структура("Константа, Справочник, Документ, ЖурналДокументов, ПланВидовХарактеристик, ПланВидовРасчета, ПланСчетов
												|, Обработка, Отчет, РегистрСведений, РегистрНакопления, РегистрБухгалтерии, РегистрРасчета, БизнесПроцесс, Задача
												|, ПланОбмена");

	СтрокиДЗ = ДеревоОбъектов.ПолучитьЭлементы();
	СтрокиДЗ.Очистить();

	СтрДЗ = СтрокиДЗ.Добавить();
	ЗаполнитьЗначенияСвойств(СтрДЗ, вСформироватьУзелКонфигурация());
	СтрДЗ.ТипУзла = 1;
	
	
	// избранное
	СтрДЗ = СтрокиДЗ.Добавить();
	СтрДЗ.Имя = "Избранное...";
	СтрДЗ.ВидУзла = "Избранное";
	СтрДЗ.ТипУзла = 1;
	СтрДЗ.ПолноеИмя = "Избранное";
	мИдентификаторИзбранного = СтрДЗ.ПолучитьИдентификатор();

	Для Каждого Элем Из _СодержимоеИзбранного.Данные Цикл
		НС = СтрДЗ.ПолучитьЭлементы().Добавить();
		ЗаполнитьЗначенияСвойств(НС, Элем);
	КонецЦикла;
	СтрДЗ = СтрокиДЗ.Добавить();
	СтрДЗ.Имя = "Общие";
	СтрДЗ.ВидУзла = "ГруппаРазделовМД";
	СтрДЗ.ТипУзла = 1;
	СтрДЗ.ПолучитьЭлементы().Добавить();

	СтрукРазделы = Новый Структура("Константы, Справочники, Документы, ЖурналыДокументов, Перечисления, ПланыВидовХарактеристик, ПланыВидовРасчета, ПланыСчетов
								   |, Обработки, Отчеты, РегистрыСведений, РегистрыНакопления, РегистрыБухгалтерии, РегистрыРасчета, БизнесПроцессы, Задачи");

	вРассчитатьКоличествоОбъектовМД(СтрукРазделы);

	Для Каждого Элем Из СтрукРазделы Цикл
		СтрДЗ = СтрокиДЗ.Добавить();
		СтрДЗ.Имя = Элем.Ключ;
		СтрДЗ.Имя = Элем.Ключ + " (" + Элем.Значение + ")";
		СтрДЗ.ВидУзла = "РазделМД";
		СтрДЗ.ТипУзла = 1;
		СтрДЗ.ПолучитьЭлементы().Добавить();
	КонецЦикла;

	_АдресаХранилищ = Новый Структура("Движения, Подписки, Команды, ОбщиеКоманды, Подсистемы, РолиИПользователи");
	_АдресаХранилищ.Движения = ПоместитьВоВременноеХранилище(-1, УникальныйИдентификатор);
	_АдресаХранилищ.Подписки = ПоместитьВоВременноеХранилище(-1, УникальныйИдентификатор);
	_АдресаХранилищ.Команды  = ПоместитьВоВременноеХранилище(-1, УникальныйИдентификатор);
	_АдресаХранилищ.ОбщиеКоманды = ПоместитьВоВременноеХранилище(-1, УникальныйИдентификатор);
	_АдресаХранилищ.Подсистемы = ПоместитьВоВременноеХранилище(-1, УникальныйИдентификатор);
	_АдресаХранилищ.РолиИПользователи = "";
	
	// хранилища настроек
	СтрокиДЗ = ДеревоНастроек.ПолучитьЭлементы();
	СтрокиДЗ.Очистить();

	ГруппаДЗ = СтрокиДЗ.Добавить();
	ГруппаДЗ.Представление = "Стандартные хранилища настроек";

	СтрукРазделы = Новый Структура("ХранилищеВариантовОтчетов, ХранилищеНастроекДанныхФорм, ХранилищеОбщихНастроек
								   |, ХранилищеПользовательскихНастроекДинамическихСписков, ХранилищеПользовательскихНастроекОтчетов, ХранилищеСистемныхНастроек");

	Для Каждого Элем Из СтрукРазделы Цикл
		СтрДЗ = ГруппаДЗ.ПолучитьЭлементы().Добавить();
		СтрДЗ.Имя = Элем.Ключ;
		СтрДЗ.Представление = Элем.Ключ;
		СтрДЗ.ВидУзла = "Х";
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура кОткрытьВНовомОкне(Команда)
	ОткрытьФорму(ПутьКФормам, , , ТекущаяДата(), , , , РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры

&НаКлиенте
Процедура _СвернутьВсеУзлы(Команда)
	Для Каждого УзелДЗ Из ДеревоОбъектов.ПолучитьЭлементы() Цикл
		Элементы.ДеревоОбъектов.Свернуть(УзелДЗ.ПолучитьИдентификатор());
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура _ОбновитьСписокПользователейИБ(Команда)
	Для Каждого Стр Из ДеревоОбъектов.ПолучитьЭлементы() Цикл
		Если Стр.Имя = "Общие" Тогда
			Для Каждого УзелДЗ Из Стр.ПолучитьЭлементы() Цикл
				Если УзелДЗ.ВидУзла = "РазделМД" И СтрНайти(УзелДЗ.Имя, "Пользователи") = 1 Тогда
					СтрокиДЗ = УзелДЗ.ПолучитьЭлементы();
					СтрокиДЗ.Очистить();

					Струк = вПолучитьСоставРазделаМД("Пользователи");
					Для Каждого Элем Из Струк.МассивОбъектов Цикл
						СтрДЗ = СтрокиДЗ.Добавить();
						ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
					КонецЦикла;
					УзелДЗ.Имя = "Пользователи (" + Струк.ЧислоОбъектов + ")";

					Прервать;
				КонецЕсли;
			КонецЦикла;

			Прервать;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура _СоздатьПользователяИБ(Команда)
	СтрукПараметры = Новый Структура("РежимРаботы", 1);
	ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", СтрукПараметры, , , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура _СкопироватьПользователяИБ(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено И СтрНайти(ТекДанные.ПолноеИмя, "Пользователь.") = 1 Тогда
		СтрукПараметры = Новый Структура("РежимРаботы, ИдентификаторПользователяИБ", 2, ТекДанные.ПредставлениеОбъекта);
		ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", СтрукПараметры, , , , , ,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _УдалитьПользователяИБ(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено И СтрНайти(ТекДанные.ПолноеИмя, "Пользователь.") = 1 Тогда
		пТекст = СтрШаблон("Пользователь ""%1"" будет удален из информационной базы!
						   |Продолжить?", ТекДанные.Имя);
		ПоказатьВопрос(Новый ОписаниеОповещения("вУдалитьПользователяОтвет", ЭтаФорма, ТекДанные), пТекст,
			РежимДиалогаВопрос.ДаНетОтмена, 20);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вУдалитьПользователяОтвет(Ответ, ТекДанные) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		пРезультат = вУдалитьПользователяИБ(ТекДанные.ПредставлениеОбъекта);
		Если пРезультат.Отказ Тогда
			вПоказатьПредупреждение(пРезультат.ПричинаОтказа);
		Иначе
			ТекДанные.ПолучитьРодителя().ПолучитьЭлементы().Удалить(ТекДанные);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вУдалитьПользователяИБ(Идентификатор)
	пРезультат = Новый Структура("Отказ, ПричинаОтказа", Ложь, "");

	Попытка
		пUUID = Новый УникальныйИдентификатор(Идентификатор);

		пПользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(пUUID);
		Если пПользователь = Неопределено Тогда
			пРезультат.Отказ = Истина;
			пРезультат.ПричинаОтказа = "Указанный пользователь не найден!";
			Возврат пРезультат;
		КонецЕсли;

		пТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

		Если пТекПользователь.УникальныйИдентификатор = пUUID Тогда
			пРезультат.Отказ = Истина;
			пРезультат.ПричинаОтказа = "Нельзя удалить текущего пользоватля!";
			Возврат пРезультат;
		КонецЕсли;

		пПользователь.Удалить();
	Исключение
		пРезультат.Отказ = Истина;
		пРезультат.ПричинаОтказа = ОписаниеОшибки();
	КонецПопытки;

	Возврат пРезультат;
КонецФункции
&НаКлиенте
Процедура кПоказатьСвойстваОбъекта(Команда)
	Если Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя = "СтрСтруктураХранения" Тогда
		ТекДанные = Неопределено;
		Если Элементы.ГруппаТаблицыИИндексы.ТекущаяСтраница.Имя = "СтрИндексы" Тогда
			ТекДанные = Элементы._СХИндексы.ТекущиеДанные;
		ИначеЕсли Элементы.ГруппаТаблицыИИндексы.ТекущаяСтраница.Имя = "СтрТаблицы" Тогда
			ТекДанные = Элементы._СХТаблицы.ТекущиеДанные;
		КонецЕсли;

		Если ТекДанные <> Неопределено Тогда
			пПолноеИмя = ТекДанные.Метаданные;
			Если пПолноеИмя = "<не задано>" Тогда
				Возврат;
			КонецЕсли;

			Поз = СтрНайти(пПолноеИмя, ".", , , 2);
			Если Поз <> 0 Тогда
				пПолноеИмя = Лев(пПолноеИмя, Поз - 1);
			КонецЕсли;

			СтрукПараметры = Новый Структура("ПолноеИмя, ПутьКФормам, _АдресаХранилищ, ОписаниеПравДоступа",
				пПолноеИмя, ПутьКФормам, _АдресаХранилищ, мОписаниеПравДоступа);
			СтрукПараметры.Вставить("НастройкиОбработки", вСформироватьСтруктуруНастроекФормыСвойствОбъекта());
			ОткрытьФорму(ПутьКФормам + "ФормаСвойств", СтрукПараметры, , пПолноеИмя, , , ,
				РежимОткрытияОкнаФормы.Независимый);
		КонецЕсли;

		Возврат;
	КонецЕсли;

	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" Тогда
			Если СтрНайти(ТекДанные.ПолноеИмя, "Пользователь.") = 1 Тогда
				СтрукПараметры = Новый Структура("ИдентификаторПользователяИБ", ТекДанные.ПредставлениеОбъекта);
				ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", СтрукПараметры, , ТекДанные.ПолноеИмя, , , ,
					РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
			Иначе
				СтрукПараметры = Новый Структура("ПолноеИмя, ПутьКФормам, _АдресаХранилищ, ОписаниеПравДоступа",
					ТекДанные.ПолноеИмя, ПутьКФормам, _АдресаХранилищ, мОписаниеПравДоступа);
				СтрукПараметры.Вставить("НастройкиОбработки", вСформироватьСтруктуруНастроекФормыСвойствОбъекта());
				ОткрытьФорму(ПутьКФормам + "ФормаСвойств", СтрукПараметры, , ТекДанные.ПолноеИмя, , , ,
					РежимОткрытияОкнаФормы.Независимый);
			КонецЕсли;
		ИначеЕсли ТекДанные.ВидУзла = "Конфигурация" Тогда
			СтрукПараметры = Новый Структура("ПолноеИмя, ПутьКФормам, _АдресаХранилищ, ОписаниеПравДоступа",
				"Конфигурация", ПутьКФормам, _АдресаХранилищ, мОписаниеПравДоступа);
			СтрукПараметры.Вставить("НастройкиОбработки", вСформироватьСтруктуруНастроекФормыСвойствОбъекта());
			ОткрытьФорму(ПутьКФормам + "ФормаСвойств", СтрукПараметры, , ТекДанные.ПолноеИмя, , , ,
				РежимОткрытияОкнаФормы.Независимый);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура кОткрытьФормуСписка(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" И Не вЭтоПрочаяКоманда(ТекДанные.ПолноеИмя) Тогда
			Попытка
				ВидОбъектМД = Лев(ТекДанные.ПолноеИмя, СтрНайти(ТекДанные.ПолноеИмя, ".") - 1);

				Если ВидОбъектМД = "Пользователь" Тогда
					СтандартнаяОбработка = Ложь;
					СтрукПараметры = Новый Структура("ИдентификаторПользователяИБ", ТекДанные.ПредставлениеОбъекта);
					ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", СтрукПараметры, , ТекДанные.ПолноеИмя, , , ,
						РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
					Возврат;
				КонецЕсли;

				Если Не мОбычныеПрикладныеОбъекты.Свойство(ВидОбъектМД) Тогда
					Возврат;
				КонецЕсли;

				Если ВидОбъектМД = "Обработка" Тогда
					ИмяФормыМД = ".Форма";
				ИначеЕсли ВидОбъектМД = "Отчет" Тогда
					ИмяФормыМД = ".Форма";
				ИначеЕсли ВидОбъектМД = "Константа" Тогда
					ИмяФормыМД = ".ФормаКонстант";
				ИначеЕсли ВидОбъектМД = "ОбщаяФорма" Тогда
					ИмяФормыМД = "";
				ИначеЕсли ВидОбъектМД = "Перечисление" Тогда
					СтандартнаяОбработка = Истина;
					Возврат;
				Иначе
					ИмяФормыМД = ".ФормаСписка";
				КонецЕсли;

				СтандартнаяОбработка = Ложь;
				ОткрытьФорму(ТекДанные.ПолноеИмя + ИмяФормыМД);
			Исключение
				Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура кСвернутьРазделДерева(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		УзелДЗ = ТекДанные.ПолучитьРодителя();
		Если УзелДЗ <> Неопределено Тогда
			Строка = УзелДЗ.ПолучитьИдентификатор();
			Элементы.ДеревоОбъектов.ТекущаяСтрока = Строка;
			Элементы.ДеревоОбъектов.Свернуть(Строка);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура кЗапускКонфигуратор(Команда)
	вЗапуститьСеанс1С(1);
КонецПроцедуры

&НаКлиенте
Процедура кЗапускТолстыйКлиент(Команда)
	вЗапуститьСеанс1С(2);
КонецПроцедуры

&НаКлиенте
Процедура кЗапускТолстыйКлиентУпр(Команда)
	вЗапуститьСеанс1С(3);
КонецПроцедуры

&НаКлиенте
Процедура кЗапускТонкийКлиент(Команда)
	вЗапуститьСеанс1С(4);
КонецПроцедуры

&НаКлиенте
Процедура кЗапуск1СРасш(Команда)
#Если ВебКлиент Тогда
	вОперацияНеПоддерживаетсяДляВебКлиента();
#Иначе
		ОткрытьФорму(ПутьКФормам + "ФормаЗапуска1С", , ЭтаФорма, , , , ,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
#КонецЕсли
КонецПроцедуры

&НаКлиенте
Процедура ДеревоОбъектовПередРазворачиванием(Элемент, Строка, Отказ)
	Если Не _ОтображатьПраваНаОбъекты Тогда
		Элементы.ДеревоОбъектов.ТекущаяСтрока = Строка; // полезно при раскрытии узлов, которые находятся выше
	КонецЕсли;

	УзелДЗ = ДеревоОбъектов.НайтиПоИдентификатору(Строка);
	СтрокиДЗ = УзелДЗ.ПолучитьЭлементы();
	Если СтрокиДЗ.Количество() = 1 И ПустаяСтрока(СтрокиДЗ[0].ВидУзла) Тогда
		Отказ = Истина;
		СтрокиДЗ.Очистить();

		ИмяУзлаДЗ = УзелДЗ.Имя;
		Поз = СтрНайти(ИмяУзлаДЗ, " (");
		Если Поз <> 0 Тогда
			ИмяУзлаДЗ = Лев(ИмяУзлаДЗ, Поз - 1);
		КонецЕсли;

		Если УзелДЗ.ВидУзла = "РазделМД" Тогда
			УзелДЗ = ДеревоОбъектов.НайтиПоИдентификатору(Строка);
			СтрокиДЗ = УзелДЗ.ПолучитьЭлементы();
			СтрокиДЗ.Очистить();

			Если ИмяУзлаДЗ = "Документы" Тогда
				Струк = Новый Структура("НумераторыДокументов, Последовательности");
				вРассчитатьКоличествоОбъектовМД(Струк);
				Для Каждого Элем Из Струк Цикл
					СтрДЗ = СтрокиДЗ.Добавить();
					СтрДЗ.ВидУзла = "РазделМД";
					СтрДЗ.Имя = Элем.Ключ + " (" + Элем.Значение + ")";
					СтрДЗ.ПолучитьЭлементы().Добавить();
				КонецЦикла;
				
				//СтрДЗ = СтрокиДЗ.Добавить();
				//СтрДЗ.ВидУзла = "РазделМД";
				//СтрДЗ.Имя = "НумераторыДокументов";
				//СтрДЗ.ПолучитьЭлементы().Добавить();
				//
				//СтрДЗ = СтрокиДЗ.Добавить();
				//СтрДЗ.ВидУзла = "РазделМД";
				//СтрДЗ.Имя = "Последовательности";
				//СтрДЗ.ПолучитьЭлементы().Добавить();
			КонецЕсли;

			Струк = вПолучитьСоставРазделаМД(ИмяУзлаДЗ);
			Для Каждого Элем Из Струк.МассивОбъектов Цикл
				СтрДЗ = СтрокиДЗ.Добавить();
				ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
				Если СтрНайти(СтрДЗ.ПолноеИмя, "Перечисление.") = 1 Тогда
					СтрДЗ.ПолучитьЭлементы().Добавить();
				ИначеЕсли СтрНайти(СтрДЗ.ПолноеИмя, "Подсистема.") = 1 Тогда
					Если Элем.ЕстьДети Тогда
						СтрДЗ.ПолучитьЭлементы().Добавить();
					КонецЕсли;
				ИначеЕсли СтрНайти(СтрДЗ.ПолноеИмя, "WebСервис.") = 1 Тогда
					СтрДЗ.ПолучитьЭлементы().Добавить();
				ИначеЕсли СтрНайти(СтрДЗ.ПолноеИмя, "HTTPСервис.") = 1 Тогда
					СтрДЗ.ПолучитьЭлементы().Добавить();
				КонецЕсли;
			КонецЦикла;
			УзелДЗ.Имя = ИмяУзлаДЗ + " (" + Струк.ЧислоОбъектов + ")";

		ИначеЕсли УзелДЗ.ВидУзла = "ГруппаРазделовМД" Тогда
			СтрукРазделы = Новый Структура("Подсистемы, ОбщиеМодули, ПараметрыСеанса, Пользователи, Роли, ОбщиеРеквизиты, ПланыОбмена, ПодпискиНаСобытия, РегламентныеЗадания
										   |, ФункциональныеОпции, ПараметрыФункциональныхОпций, ОпределяемыеТипы, ХранилищаНастроек, ОбщиеФормы, ОбщиеКоманды, ГруппыКоманд, ПрочиеКоманды, ОбщиеМакеты, ПакетыXDTO, WebСервисы, HTTPСервисы");

			вРассчитатьКоличествоОбъектовМД(СтрукРазделы);

			Для Каждого Элем Из СтрукРазделы Цикл
				Если Элем.Ключ = "Пользователи" И Не вЕстьПраваАдминистратора() Тогда
					Продолжить;
				КонецЕсли;
				СтрДЗ = СтрокиДЗ.Добавить();
				СтрДЗ.Имя = Элем.Ключ;
				СтрДЗ.Имя = Элем.Ключ + " (" + Элем.Значение + ")";
				СтрДЗ.ВидУзла = "РазделМД";
				СтрДЗ.ТипУзла = 1;
				СтрДЗ.ПолучитьЭлементы().Добавить();
			КонецЦикла;

		ИначеЕсли УзелДЗ.ВидУзла = "ОбъектМД" Тогда
			ВидОбъектМД = Лев(УзелДЗ.ПолноеИмя, СтрНайти(УзелДЗ.ПолноеИмя, ".") - 1);

			УзелДЗ = ДеревоОбъектов.НайтиПоИдентификатору(Строка);
			СтрокиДЗ = УзелДЗ.ПолучитьЭлементы();
			СтрокиДЗ.Очистить();

			Если ВидОбъектМД = "Перечисление" Тогда
				МассивОбъектов = вПолучитьСоставПеречисления(УзелДЗ.ПолноеИмя);
				Для Каждого Элем Из МассивОбъектов Цикл
					СтрДЗ = СтрокиДЗ.Добавить();
					ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
				КонецЦикла;
			ИначеЕсли ВидОбъектМД = "Подсистема" Тогда
				МассивОбъектов = вПолучитьСоставПодсистемы(УзелДЗ.ПолноеИмя);
				Для Каждого Элем Из МассивОбъектов Цикл
					СтрДЗ = СтрокиДЗ.Добавить();
					ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
					Если Элем.ЕстьДети Тогда
						СтрДЗ.ПолучитьЭлементы().Добавить();
					КонецЕсли;
				КонецЦикла;
			ИначеЕсли ВидОбъектМД = "WebСервис" Тогда
				МассивОбъектов = вПолучитьОперацииWebСервиса(УзелДЗ.ПолноеИмя);
				Для Каждого Элем Из МассивОбъектов Цикл
					СтрДЗ = СтрокиДЗ.Добавить();
					ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
				КонецЦикла;
			ИначеЕсли ВидОбъектМД = "HTTPСервис" Тогда
				МассивОбъектов = вПолучитьМетодыHTTPСервиса(УзелДЗ.ПолноеИмя);
				Для Каждого Элем Из МассивОбъектов Цикл
					СтрДЗ = СтрокиДЗ.Добавить();
					ЗаполнитьЗначенияСвойств(СтрДЗ, Элем);
					Для Каждого ЭлемХ Из Элем.Методы Цикл
						ЗаполнитьЗначенияСвойств(СтрДЗ.ПолучитьЭлементы().Добавить(), ЭлемХ);
					КонецЦикла;
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
		Элементы.ДеревоОбъектов.Развернуть(Строка);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вЗапуститьСеанс1С(ТипЗапуска)
	УИ_ОбщегоНазначенияКлиент.ЗапуститьСеанс1С(ТипЗапуска, ИмяПользователя());
КонецПроцедуры

&НаКлиенте
Процедура вВыполнитьКомандуОС(пКоманда)
	Попытка
		НачатьЗапускПриложения(Новый ОписаниеОповещения("вПослеЗапускаПриложения", ЭтаФорма), пКоманда);
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура вПослеЗапускаПриложения(КодВозврата, ДопПарам = Неопределено) Экспорт
	// фиктивная процедура для совместимости разных версий платыормы
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция вПереченьПолейУзлаДЗ()
	Возврат "Имя, Синоним, ОсновнаяТаблицаSQL, ПолноеИмя, ВидУзла, ТипУзла, ПредставлениеОбъекта, КоличествоОбъектов";
КонецФункции

&НаСервереБезКонтекста
Функция вСформироватьСтруктуруУзлаДЗ(ВидУзла = "", Имя = "", ПолноеИмя = "", Синоним = "", ЕстьДети = Ложь,
	ПредставлениеОбъекта = "")
	Струк = Новый Структура("ВидУзла, Имя, ПолноеИмя, Синоним, ПредставлениеОбъекта, ЕстьДети, ОсновнаяТаблицаSQL",
		ВидУзла, Имя, ПолноеИмя, Синоним, ПредставлениеОбъекта, ЕстьДети, "");
	Возврат Струк;
КонецФункции

&НаСервереБезКонтекста
Функция вСформироватьУзелКонфигурация()
	Струк = Новый Структура("Имя, Синоним, Версия", "", "", "");
	ЗаполнитьЗначенияСвойств(Струк, Метаданные);

	Если ПустаяСтрока(Струк.Синоним) Тогда
		Струк.Синоним = Струк.Имя;
	КонецЕсли;
	Если Не ПустаяСтрока(Струк.Версия) Тогда
		Струк.Синоним = Струк.Синоним + " (" + Струк.Версия + ")";
	КонецЕсли;

	Возврат вСформироватьСтруктуруУзлаДЗ("Конфигурация", Струк.Имя, "Конфигурация", Струк.Синоним);
КонецФункции

&НаСервереБезКонтекста
Функция вПроверитьНаличиеСвойства(Объект, ИмяСвойства)
	Струк = Новый Структура(ИмяСвойства);
	ЗаполнитьЗначенияСвойств(Струк, Объект);

	Возврат (Струк[ИмяСвойства] <> Неопределено);
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьСоставРазделаМД(Знач ИмяРаздела)
	Поз = СтрНайти(ИмяРаздела, " ");
	Если Поз <> 0 Тогда
		ИмяРаздела = Лев(ИмяРаздела, Поз - 1);
	КонецЕсли;

	СтрукРезультат = Новый Структура("ЧислоОбъектов, МассивОбъектов", 0, Новый Массив);
	
	// для упорядочивания по именам объектов
	пОбъектыСДопПредставлением = Новый Структура("ПланыОбмена, Справочники, Документы, ПланыВидовХарактеристик, ПланыВидовРасчета, ПланыСчетов, БизнесПроцессы, Задачи");
	ЕстьДопПредставление = пОбъектыСДопПредставлением.Свойство(ИмяРаздела);

	ТипСтрока = Новый ОписаниеТипов("Строка");

	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("ОбъектМД");
	Таблица.Колонки.Добавить("Имя", ТипСтрока);
	Таблица.Колонки.Добавить("Синоним", ТипСтрока);
	Таблица.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока);
	Таблица.Колонки.Добавить("ОсновнаяТаблицаSQL", ТипСтрока);
	Таблица.Колонки.Добавить("ПолноеИмя", ТипСтрока);
	Таблица.Колонки.Добавить("ВидУзла", ТипСтрока);
	Таблица.Колонки.Добавить("ЕстьДети", Новый ОписаниеТипов("Булево"));

	Если ИмяРаздела = "Пользователи" Тогда
		Если вЕстьПраваАдминистратора() Тогда
			Для Каждого Элем Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
				Стр = Таблица.Добавить();
				Стр.Имя = Элем.Имя;
				Стр.Синоним = Элем.ПолноеИмя;
				Стр.ПредставлениеОбъекта = Элем.УникальныйИдентификатор;
				Стр.ПолноеИмя = "Пользователь." + Элем.Имя;
				Стр.ВидУзла = "ОбъектМД";
			КонецЦикла;
		КонецЕсли;
	ИначеЕсли ИмяРаздела = "ПрочиеКоманды" Тогда
		ПереченьРазделов = "Справочники, ЖурналыДокументов, Документы, Перечисления, Обработки, Отчеты,
						   |ПланыСчетов, ПланыВидовХарактеристик, ПланыВидовРасчета, ПланыОбмена,
						   |РегистрыСведений, РегистрыНакопления, РегистрыРасчета, РегистрыБухгалтерии,
						   |БизнесПроцессы, Задачи, КритерииОтбора";

		СтрукРазделы = Новый Структура(ПереченьРазделов);

		Для Каждого Элем Из СтрукРазделы Цикл
			Для Каждого ОбъектХХХ Из Метаданные[Элем.Ключ] Цикл
				ИмяТипаХХХ = ОбъектХХХ.ПолноеИмя();

				Если вПроверитьНаличиеСвойства(ОбъектХХХ, "Команды") Тогда
					Для Каждого Элем Из ОбъектХХХ.Команды Цикл
						Стр = Таблица.Добавить();
						Стр.ОбъектМД = Элем;
						Стр.Имя = Элем.Имя;
						Стр.Синоним = Элем.Представление();
						Стр.ПолноеИмя = Элем.ПолноеИмя();
						Стр.ВидУзла = "ОбъектМД";
					КонецЦикла;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;

	Иначе
		Для Каждого Элем Из Метаданные[ИмяРаздела] Цикл
			Стр = Таблица.Добавить();
			Стр.ОбъектМД = Элем;
			Стр.Имя = Элем.Имя;
			Стр.Синоним = Элем.Представление();
			Стр.ПредставлениеОбъекта = ?(ЕстьДопПредставление, Элем.ПредставлениеОбъекта, "");
			Стр.ПолноеИмя = Элем.ПолноеИмя();
			Стр.ВидУзла = "ОбъектМД";

			Если ИмяРаздела = "Подсистемы" Тогда
				Стр.ЕстьДети = (Элем.Подсистемы.Количество() <> 0);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Если ИмяРаздела = "ПрочиеКоманды" Тогда
		Таблица.Сортировать("ПолноеИмя");
	Иначе
		Таблица.Сортировать("Имя");
	КонецЕсли;

	Для Каждого Стр Из Таблица Цикл
		Струк = вСформироватьСтруктуруУзлаДЗ();
		ЗаполнитьЗначенияСвойств(Струк, Стр);
		СтрукРезультат.МассивОбъектов.Добавить(Струк);
	КонецЦикла;

	Если ИмяРаздела = "Подсистемы" Тогда
		СтрукРезультат.ЧислоОбъектов = вПолучитьКоличествоПодсистем();
	Иначе
		СтрукРезультат.ЧислоОбъектов = СтрукРезультат.МассивОбъектов.Количество();
	КонецЕсли;

	Возврат СтрукРезультат;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьСоставПеречисления(Знач ПолноеИмя)
	МассивОбъектов = Новый Массив;

	ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);
	Если ОбъектМД <> Неопределено Тогда
		Для Каждого ЭлемХ Из ОбъектМД.ЗначенияПеречисления Цикл
			Струк = вСформироватьСтруктуруУзлаДЗ("ЗначениеПеречисления", ЭлемХ.Имя, "", ЭлемХ.Представление());
			МассивОбъектов.Добавить(Струк);
		КонецЦикла;
	КонецЕсли;

	Возврат МассивОбъектов;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьОперацииWebСервиса(Знач ПолноеИмя)
	МассивОбъектов = Новый Массив;

	ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);
	Если ОбъектМД <> Неопределено Тогда
		Для Каждого ЭлемХ Из ОбъектМД.Операции Цикл
			Струк = вСформироватьСтруктуруУзлаДЗ("ОбъектМД", ЭлемХ.Имя, ЭлемХ.ПолноеИмя(), ЭлемХ.Представление());
			МассивОбъектов.Добавить(Струк);
		КонецЦикла;
	КонецЕсли;

	Возврат МассивОбъектов;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьМетодыHTTPСервиса(Знач ПолноеИмя)
	МассивОбъектов = Новый Массив;

	ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);
	Если ОбъектМД <> Неопределено Тогда
		Для Каждого ЭлемХ Из ОбъектМД.ШаблоныURL Цикл
			Струк = вСформироватьСтруктуруУзлаДЗ("ОбъектМД", ЭлемХ.Имя, ЭлемХ.ПолноеИмя(), ЭлемХ.Представление());
			МассивОбъектов.Добавить(Струк);
			Струк.Вставить("Методы", Новый Массив);
			Для Каждого ЭлемХХХ Из ЭлемХ.Методы Цикл
				СтрукХХХ = вСформироватьСтруктуруУзлаДЗ("ОбъектМД", ЭлемХХХ.Имя, ЭлемХХХ.ПолноеИмя(),
					ЭлемХХХ.Представление());
				Струк.Методы.Добавить(СтрукХХХ);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;

	Возврат МассивОбъектов;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьСоставПодсистемы(Знач ПолноеИмя)
	ТипСтрока = Новый ОписаниеТипов("Строка");

	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("ОбъектМД");
	Таблица.Колонки.Добавить("Имя", ТипСтрока);
	Таблица.Колонки.Добавить("Синоним", ТипСтрока);
	Таблица.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока);
	Таблица.Колонки.Добавить("ПолноеИмя", ТипСтрока);
	Таблица.Колонки.Добавить("ВидУзла", ТипСтрока);
	Таблица.Колонки.Добавить("ЕстьДети", Новый ОписаниеТипов("Булево"));

	ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);
	Если ОбъектМД <> Неопределено Тогда
		Для Каждого Элем Из ОбъектМД.Подсистемы Цикл
			Стр = Таблица.Добавить();
			Стр.ОбъектМД = Элем;
			Стр.Имя = Элем.Имя;
			Стр.Синоним = Элем.Представление();
			Стр.ПолноеИмя = Элем.ПолноеИмя();
			Стр.ВидУзла = "ОбъектМД";
			Стр.ЕстьДети = (Элем.Подсистемы.Количество() <> 0);
		КонецЦикла;
	КонецЕсли;
	Таблица.Сортировать("Имя");

	МассивОбъектов = Новый Массив;

	Для Каждого Стр Из Таблица Цикл
		Струк = вСформироватьСтруктуруУзлаДЗ();
		ЗаполнитьЗначенияСвойств(Струк, Стр);
		МассивОбъектов.Добавить(Струк);
	КонецЦикла;

	Возврат МассивОбъектов;
КонецФункции

&НаСервереБезКонтекста
Процедура вРассчитатьКоличествоОбъектовМД(СтрукРазделы)
	УстановитьПривилегированныйРежим(Истина);

	Для Каждого Элем Из СтрукРазделы Цикл
		ЧислоОбъектов = 0;
		Если Элем.Ключ = "Пользователи" Тогда
			Если вЕстьПраваАдминистратора() Тогда
				ЧислоОбъектов = ПользователиИнформационнойБазы.ПолучитьПользователей().Количество();
			КонецЕсли;
		ИначеЕсли Элем.Ключ = "Подсистемы" Тогда
			ЧислоОбъектов = вПолучитьКоличествоПодсистем();
		ИначеЕсли Элем.Ключ = "ПрочиеКоманды" Тогда
			ЧислоОбъектов = "???"; //вПолучитьКоличествоПодсистем();
		Иначе
			ЧислоОбъектов = Метаданные[Элем.Ключ].Количество();
		КонецЕсли;
		СтрукРазделы.Вставить(Элем.Ключ, ЧислоОбъектов);
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вПолучитьКоличествоПодсистем(Знач ЭтоПервыйВызов = Истина, ПодсистемаМД = Неопределено, Соотв = Неопределено)
	Если ЭтоПервыйВызов Тогда
		Соотв = Новый Соответствие;

		Для Каждого Элем Из Метаданные.Подсистемы Цикл
			вПолучитьКоличествоПодсистем(Ложь, Элем, Соотв);
		КонецЦикла;

		Возврат Соотв.Количество();
	Иначе
		Соотв.Вставить(ПодсистемаМД, 1);
		Для Каждого Элем Из ПодсистемаМД.Подсистемы Цикл
			Соотв.Вставить(Элем, 1);
			вПолучитьКоличествоПодсистем(Ложь, Элем, Соотв);
		КонецЦикла;

		Возврат 0;
	КонецЕсли;
КонецФункции
&НаКлиенте
Функция вЭтоПрочаяКоманда(ПолноеИмя)
	Возврат (СтрНайти(ПолноеИмя, "Подсистема.") <> 1 И СтрНайти(ПолноеИмя, ".Команда.") <> 0);
КонецФункции

&НаКлиенте
Процедура ДеревоОбъектовВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;

	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" Тогда
			Если вЭтоПрочаяКоманда(ТекДанные.ПолноеИмя) Тогда
				кПоказатьСвойстваОбъекта(Неопределено);
				Возврат;
			КонецЕсли;

			СпецПеречень = "Обработка, Отчет";
			Струк = Новый Структура(СпецПеречень);

			ВидОбъектМД = Лев(ТекДанные.ПолноеИмя, СтрНайти(ТекДанные.ПолноеИмя, ".") - 1);
			Если Струк.Свойство(ВидОбъектМД) Тогда
				кОткрытьФормуСписка(Неопределено);
			Иначе
				кПоказатьСвойстваОбъекта(Неопределено);
			КонецЕсли;
		ИначеЕсли ТекДанные.ВидУзла = "Конфигурация" Тогда
			кПоказатьСвойстваОбъекта(Неопределено);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДеревоОбъектовПриИзменении(Элемент)
	вВключитьФлагИзмененияНастроек();
КонецПроцедуры

&НаКлиенте
Процедура кИзменитьМасштабОтображенияФорм(Команда)
	ОткрытьФорму(ПутьКФормам + "ФормаВыбораМасштабаОтображения", , ЭтаФорма, , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура кОткрытьФормуСпискаДоп(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" И Не вЭтоПрочаяКоманда(ТекДанные.ПолноеИмя) Тогда
			СтрукКатегории = Новый Структура("Справочник, Документ, ЖурналДокументов,ПланВидовХарактеристик, ПланВидовРасчета, ПланСчетов
											 |, РегистрСведений, РегистрНакопления, РегистрБухгалтерии, РегистрРасчета, БизнесПроцесс, Задача");

			НадоОбработать = Ложь;
			Для Каждого Элем Из СтрукКатегории Цикл
				Если СтрНайти(ТекДанные.ПолноеИмя, Элем.Ключ) = 1 Тогда
					НадоОбработать = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;

			Если НадоОбработать Тогда
				УИ_ОбщегоНазначенияКлиент.ОткрытьДинамическийСписок(ТекДанные.ПолноеИмя);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
&НаСервере
Функция вОбновитьТабНастройки(Знач ВидУзла, Знач Имя)
	УстановитьПривилегированныйРежим(Истина);

	Если ВидУзла = "Х" Тогда
		МенеджерХН = Вычислить(Имя);
	Иначе
		Возврат Ложь;
	КонецЕсли;

	Если ТипЗнч(МенеджерХН) <> Тип("СтандартноеХранилищеНастроекМенеджер") Тогда
		Возврат Ложь;
	КонецЕсли;

	Если Не вЕстьПраваАдминистратора() Тогда
		ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
		Отбор = Новый Структура("Пользователь", ТекПользователь.Имя);
	Иначе
		Отбор = Неопределено;
	КонецЕсли;

	Попытка
		Выборка = МенеджерХН.Выбрать(Отбор);
		Пока Выборка.Следующий() Цикл
			НС = ТабНастройки.Добавить();
			НС.КлючНастроек = Выборка.КлючНастроек;
			НС.КлючОбъекта = Выборка.КлючОбъекта;
			НС.Пользователь = Выборка.Пользователь;
			НС.Представление = Выборка.Представление;
		КонецЦикла;
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;

	Возврат Истина;
КонецФункции

&НаСервере
Процедура вУдалитьМассивНастроек(Знач Имя, Знач МассивСтрок)
	УстановитьПривилегированныйРежим(Истина);

	Попытка
		МенеджерХН = Вычислить(Имя);

		Для Каждого Элем Из МассивСтрок Цикл
			Стр = ТабНастройки.НайтиПоИдентификатору(Элем);
			Если Стр <> Неопределено Тогда
				МенеджерХН.Удалить(Стр.КлючОбъекта, Стр.КлючНастроек, Стр.Пользователь);
				ТабНастройки.Удалить(Стр);
			КонецЕсли;
		КонецЦикла;
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ТабНастройкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТабНастройкиПередУдалением(Элемент, Отказ)
	Отказ = Истина;
	Если Не ПустаяСтрока(_ИмяМенеджераНастроек) Тогда
		СтрукПараметры = Новый Структура;
		СтрукПараметры.Вставить("МассивСтрок", Новый ФиксированныйМассив(Элемент.ВыделенныеСтроки));
		вПоказатьВопрос("Отмеченные настройки будут удалены. Продолжить?", "ТабНастройкиПередУдалениемДалее",
			СтрукПараметры);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТабНастройкиПередУдалениемДалее(Результат, Параметры) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		вУдалитьМассивНастроек(_ИмяМенеджераНастроек, Параметры.МассивСтрок);
		вОбновитьЗаголовкиНастройки();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура кОбновтьТаблицуНастроек(Команда)
	ТекДанные = Элементы.ДеревоНастроек.ТекущиеДанные;

	Если ТекДанные <> Неопределено И ТекДанные.ВидУзла = "Х" Тогда
		ТабНастройки.Очистить();

		Если Не вОбновитьТабНастройки(ТекДанные.ВидУзла, ТекДанные.Имя) Тогда
			ТекДанные.ВидУзла = "-";
			ТекДанные.Представление = ТекДанные.Имя + " (не поддерживается)";
		КонецЕсли;

		_ИмяМенеджераНастроек = ТекДанные.Имя;

		вОбновитьЗаголовкиНастройки();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вОбновитьЗаголовкиНастройки()
	Элементы.ДекорацияНастройки.Заголовок = _ИмяМенеджераНастроек + " (" + ТабНастройки.Количество() + " шт.)";
КонецПроцедуры



// страница Сервис

&НаСервере
Процедура вЗаполнитьДеревоСервис()
	Макет = вПолучитьОбработку().ПолучитьМакет("МакетСервис");
	Если Макет = Неопределено Тогда
		Макет = Новый ТабличныйДокумент;
	КонецЕсли;

	СтрукСвойства = Новый Структура("Доступность, Представление, ВидУзла, Имя, Комментарий, ДоступностьВыражение",
		Истина);

	КореньДЗ = ДеревоСервис;
	УзелДЗ = ДеревоСервис;

	Для НомерСтроки = 2 По Макет.ВысотаТаблицы Цикл
		СтрукСвойства.Представление = СокрЛП(Макет.Область(НомерСтроки, 1).Текст);

		Если Не ПустаяСтрока(СтрукСвойства.Представление) Тогда
			СтрукСвойства.ВидУзла = СокрЛП(Макет.Область(НомерСтроки, 2).Текст);
			СтрукСвойства.Имя = СокрЛП(Макет.Область(НомерСтроки, 3).Текст);
			СтрукСвойства.ДоступностьВыражение = СокрЛП(Макет.Область(НомерСтроки, 4).Текст);
			СтрукСвойства.Комментарий = СокрЛП(Макет.Область(НомерСтроки, 5).Текст);

			Если СтрукСвойства.ВидУзла = "Г" Тогда
				УзелДЗ = КореньДЗ.ПолучитьЭлементы().Добавить();
				ЗаполнитьЗначенияСвойств(УзелДЗ, СтрукСвойства);
				УзелДЗ.ЭтоГруппа = Истина;
				УзелДЗ.Картинка = -1;
			Иначе
				СтрДЗ = УзелДЗ.ПолучитьЭлементы().Добавить();
				ЗаполнитьЗначенияСвойств(СтрДЗ, СтрукСвойства);
				Если Не ПустаяСтрока(СтрукСвойства.ДоступностьВыражение) Тогда
					СтрДЗ.Доступность = Вычислить(СтрукСвойства.ДоступностьВыражение);
				КонецЕсли;
				Если Не СтрДЗ.Доступность Тогда
					СтрДЗ.Представление = СтрДЗ.Представление + " (не доступно)";
				КонецЕсли;

				Если СтрДЗ.Имя = "ПереключитьМонопольныйРежим" Тогда
					СтрДЗ.Представление = ?(_КонтекстФормы.МонопольныйРежим, "Отключить монопольный режим",
						"Установить монопольный режим");
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ДеревоСервисВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтрДЗ = ДеревоСервис.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если СтрДЗ <> Неопределено Тогда
		Если Не СтрДЗ.ЭтоГруппа Тогда
			СтандартнаяОбработка = Ложь;
			Если СтрДЗ.Доступность Тогда
				Попытка
					вОбработатьКомандуСервис(СтрДЗ);
				Исключение
				КонецПопытки;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вОбработатьКомандуСервис(СтрДЗ)
	Если СтрДЗ.Имя = "ВерсииПодсистем" Тогда
		ОткрытьФорму("РегистрСведений.ВерсииПодсистем.ФормаСписка");
	ИначеЕсли СтрДЗ.Имя = "ОбновитьПовторноИспользуемыеЗначения" Тогда
		ОбновитьПовторноИспользуемыеЗначения();
	ИначеЕсли СтрДЗ.Имя = "ОчиститьИзбранное" Тогда
		вПоказатьВопрос("Избранное будет очищено. Продолжить?", "вОчиститьИзбранное");
	ИначеЕсли СтрДЗ.Имя = "МасштабОтображения" Тогда
		кИзменитьМасштабОтображенияФорм(Неопределено);
	ИначеЕсли СтрДЗ.Имя = "УстановитьБлокировкуСеансов" Тогда
		ОткрытьФорму(ПутьКФормам + "ФормаБлокировкиСеансов", , ЭтаФорма, , , , ,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	ИначеЕсли СтрДЗ.Имя = "ПереключитьМонопольныйРежим" Тогда
		_КонтекстФормы.МонопольныйРежим = РезультатПереключенияМонопольногоРежима();
		СтрДЗ.Представление = ?(_КонтекстФормы.МонопольныйРежим, "Отключить монопольный режим",
			"Установить монопольный режим");
	ИначеЕсли СтрДЗ.Имя = "Запуск1С" Тогда
#Если ВебКлиент Тогда
		вОперацияНеПоддерживаетсяДляВебКлиента();
#Иначе
			ОткрытьФорму(ПутьКФормам + "ФормаЗапуска1С", , ЭтаФорма, , , , ,
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
#КонецЕсли
	ИначеЕсли
	СтрДЗ.Имя = "Конфигуратор1С" Тогда
		вЗапуститьСеанс1С(1);
	ИначеЕсли СтрДЗ.Имя = "ТолстыйКлиентОбычное" Тогда
		вЗапуститьСеанс1С(2);
	ИначеЕсли СтрДЗ.Имя = "ТолстыйКлиентУпр" Тогда
		вЗапуститьСеанс1С(3);
	ИначеЕсли СтрДЗ.Имя = "ТонкийКлиентУпр" Тогда
		вЗапуститьСеанс1С(4);
	ИначеЕсли СтрДЗ.Имя = "WinStartMenu" Тогда
		вВыполнитьКомандуОС("%ProgramData%\Microsoft\Windows\Start Menu\Programs");
	ИначеЕсли СтрДЗ.Имя = "WinAppData" Тогда
		вВыполнитьКомандуОС("%AppData%");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вОчиститьИзбранное(Результат, ДопПараметры = Неопределено) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		вОчиститьИзбранноеСервер();
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура вОчиститьИзбранноеСервер()
	Избранное = ХранилищеСистемныхНастроек.Загрузить("Общее/ИзбранноеРаботыПользователя");
	Избранное.Очистить();
	ХранилищеСистемныхНастроек.Сохранить("Общее/ИзбранноеРаботыПользователя", "", Избранное);
КонецПроцедуры

&НаСервереБезКонтекста
Функция РезультатПереключенияМонопольногоРежима()
	Попытка
		УстановитьМонопольныйРежим(Не МонопольныйРежим());
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	Возврат МонопольныйРежим();
КонецФункции

&НаКлиенте
Процедура кВыполнитьСервиснуюКоманду(Команда)
	ТекДанные = Элементы.ДеревоСервис.ТекущиеДанные;
	ДеревоСервисВыбор(Элементы.ДеревоСервис, Элементы.ДеревоСервис.ТекущаяСтрока, Неопределено, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура _ОтображатьПраваНаОбъектыПриИзменении(Элемент)
	Элементы.СтраницыПраваНаОбъект.Видимость = _ОтображатьПраваНаОбъекты;

	Если Не _ОтображатьПраваНаОбъекты И Не ПустаяСтрока(_АдресаХранилищ.РолиИПользователи) Тогда
		УдалитьИзВременногоХранилища(_АдресаХранилищ.РолиИПользователи);
		_АдресаХранилищ.РолиИПользователи = "";
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДеревоОбъектовПриАктивизацииСтроки(Элемент)
	Если _ОтображатьПраваНаОбъекты Тогда
		ПодключитьОбработчикОжидания("ОбработкаАктивизацииСтрокиНавигатора", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаАктивизацииСтрокиНавигатора()
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	ТипМД = "";
	Если ТекДанные <> Неопределено И ТекДанные.ВидУзла = "ОбъектМД" Тогда
		Если ТекДанные.ПолноеИмя = мТекущийОбъектДерева Тогда
			Возврат;
		КонецЕсли;

		мТекущийОбъектДерева = ТекДанные.ПолноеИмя;

		Для Каждого Стр Из ТабПроверяемыеПрава.НайтиСтроки(Новый Структура("Пометка", Истина)) Цикл
			Стр.Пометка = Ложь;
		КонецЦикла;

		Если СтрНайти(ТекДанные.ПолноеИмя, ".Команда.") <> 0 Тогда
			ТипМД = "ОбщаяКоманда";
		Иначе
			ТипМД = Лев(ТекДанные.ПолноеИмя, СтрНайти(ТекДанные.ПолноеИмя, ".") - 1);
		КонецЕсли;

		Если ТипМД = "WebСервис" И СтрНайти(ТекДанные.ПолноеИмя, ".Операция.") <> 0 Тогда
			ТипМД = "WebСервис.Свойство";
		ИначеЕсли ТипМД = "HTTPСервис" И СтрНайти(ТекДанные.ПолноеИмя, ".ШаблонURL.") <> 0 И СтрНайти(
			ТекДанные.ПолноеИмя, ".Метод.") <> 0 Тогда
			ТипМД = "HTTPСервис.Свойство";
		КонецЕсли;

		Для Каждого Стр Из ТабПроверяемыеПрава.НайтиСтроки(Новый Структура("ОбъектМД", ТипМД)) Цикл
			Стр.Пометка = Истина;
		КонецЦикла;
	Иначе
		мТекущийОбъектДерева = "";

		Для Каждого Стр Из ТабПроверяемыеПрава.НайтиСтроки(Новый Структура("Пометка", Истина)) Цикл
			Стр.Пометка = Ложь;
		КонецЦикла;
	КонецЕсли;

	ТабРолиСДоступом.Очистить();
	ТабПользователиСДоступом.Очистить();

	Если ТекДанные <> Неопределено И ТекДанные.ВидУзла = "ОбъектМД" Тогда

		Если СтрНайти(ТекДанные.ПолноеИмя, "Роль.") = 1 Тогда
			Если Элементы.СтраницыПраваНаОбъект.ТекущаяСтраница <> Элементы.СтрПользователи Тогда
				Элементы.СтраницыПраваНаОбъект.ТекущаяСтраница = Элементы.СтрПользователи;
			КонецЕсли;
			ИмяПрава = "Х";
		ИначеЕсли СтрНайти(ТекДанные.ПолноеИмя, "Пользователь.") = 1 Тогда
			Если Элементы.СтраницыПраваНаОбъект.ТекущаяСтраница <> Элементы.СтрРоли Тогда
				Элементы.СтраницыПраваНаОбъект.ТекущаяСтраница = Элементы.СтрРоли;
			КонецЕсли;
			ИмяПрава = "Х";
		Иначе
			Если ТипМД = "" Тогда
				ТипМД = Лев(ТекДанные.ПолноеИмя, СтрНайти(ТекДанные.ПолноеИмя, ".") - 1);
			КонецЕсли;
			НайденныеСтроки = ТабПроверяемыеПрава.НайтиСтроки(Новый Структура("ОбъектМД", ТипМД));
			Если НайденныеСтроки.Количество() = 0 Тогда
				вУстановитьЗаголовкиТаблицПрав();
				Возврат;
			КонецЕсли;
			ИмяПрава = НайденныеСтроки[0].Право;
			Если ИмяПрава = "" Тогда
				вУстановитьЗаголовкиТаблицПрав();
				Возврат;
			КонецЕсли;
		КонецЕсли;

		Струк = вПолучитьПраваДоступаКОбъекту(ИмяПрава, ТекДанные.ПолноеИмя, _АдресаХранилищ.РолиИПользователи,
			УникальныйИдентификатор);
		Если Струк.ЕстьДанные Тогда
			Для Каждого Элем Из Струк.Роли Цикл
				ЗаполнитьЗначенияСвойств(ТабРолиСДоступом.Добавить(), Элем);
			КонецЦикла;

			Для Каждого Элем Из Струк.Пользователи Цикл
				ЗаполнитьЗначенияСвойств(ТабПользователиСДоступом.Добавить(), Элем);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	вУстановитьЗаголовкиТаблицПрав();
КонецПроцедуры

&НаКлиенте
Процедура вУстановитьЗаголовкиТаблицПрав()
	НайденныеСтроки = ТабПроверяемыеПрава.НайтиСтроки(Новый Структура("Пометка", Истина));
	Если НайденныеСтроки.Количество() = 0 Тогда
		ИмяПрава = "";
	Иначе
		ИмяПрава = НайденныеСтроки[0].Право + ": ";
	КонецЕсли;

	ЗаголовокРоли = ИмяПрава + "Роли, имеющие доступ (";
	ЗаголовокПользователи = ИмяПрава + "Пользователи, имеющие доступ (";

	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено И ТекДанные.ВидУзла = "ОбъектМД" Тогда
		Если СтрНайти(ТекДанные.ПолноеИмя, "Роль.") = 1 Тогда
			ЗаголовокРоли = "";
			ЗаголовокПользователи = "Пользователи, имеющие данную роль (";
		ИначеЕсли СтрНайти(ТекДанные.ПолноеИмя, "Пользователь.") = 1 Тогда
			ЗаголовокРоли = "Роли данного пользователя (";
			ЗаголовокПользователи = "";
		КонецЕсли;
	КонецЕсли;

	Если ПустаяСтрока(ЗаголовокРоли) Тогда
		Элементы.ДекорацияРоли.Заголовок = "Для заданного объекта не используются";
	Иначе
		Элементы.ДекорацияРоли.Заголовок = ЗаголовокРоли + ТабРолиСДоступом.Количество() + " шт.)";
	КонецЕсли;

	Если ПустаяСтрока(ЗаголовокПользователи) Тогда
		Элементы.ДекорацияПользователи.Заголовок = "Для заданного объекта не используются";
	Иначе
		Элементы.ДекорацияПользователи.Заголовок = ЗаголовокПользователи + ТабПользователиСДоступом.Количество()
			+ " шт.)";
	КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция вПолучитьПраваДоступаКОбъекту(Знач ИмяПрава, Знач ПолноеИмя, АдресТаблицыРолиИПользователи,
	Знач УникальныйИдентификатор)
	СтрукРезультат = Новый Структура("ЕстьДанные, Роли, Пользователи", Ложь);

	ТабРоли = Новый ТаблицаЗначений;
	ТабРоли.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
	ТабРоли.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));

	ТабПользователи = Новый ТаблицаЗначений;
	ТабПользователи.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
	ТабПользователи.Колонки.Добавить("ПолноеИмя", Новый ОписаниеТипов("Строка"));
	Если СтрНайти(ПолноеИмя, ".Команда.") <> 0 Тогда
		ТипМД = "ОбщаяКоманда";
	Иначе
		ТипМД = Лев(ПолноеИмя, СтрНайти(ПолноеИмя, ".") - 1);
	КонецЕсли;

	Если ТипМД <> "Пользователь" Тогда
		ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);

		Если ОбъектМД = Неопределено Тогда
			Возврат СтрукРезультат;
		КонецЕсли;
	КонецЕсли;

	ЭтоОбычныйРежим = (ИмяПрава <> "Х");

	Если ЭтоОбычныйРежим И ПустаяСтрока(ИмяПрава) Тогда
		Возврат СтрукРезультат;
	КонецЕсли;
	Если ЭтоОбычныйРежим Тогда
		Для Каждого Элем Из Метаданные.Роли Цикл
			Если ПравоДоступа(ИмяПрава, ОбъектМД, Элем) Тогда
				ЗаполнитьЗначенияСвойств(ТабРоли.Добавить(), Элем);
			КонецЕсли;
		КонецЦикла;

		ТабРоли.Сортировать("Имя");
	КонецЕсли;
	Если ПустаяСтрока(АдресТаблицыРолиИПользователи) Тогда
		__ТабРолиИПользователи = Новый ТаблицаЗначений;
		__ТабРолиИПользователи.Колонки.Добавить("ИмяР", Новый ОписаниеТипов("Строка"));
		__ТабРолиИПользователи.Колонки.Добавить("ИмяП", Новый ОписаниеТипов("Строка"));
		__ТабРолиИПользователи.Колонки.Добавить("ПолноеИмяП", Новый ОписаниеТипов("Строка"));

		Для Каждого П Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
			Для Каждого Р Из П.Роли Цикл
				НС = __ТабРолиИПользователи.Добавить();
				НС.ИмяР = Р.Имя;
				НС.ИмяП = П.Имя;
				НС.ПолноеИмяП = П.ПолноеИмя;
			КонецЦикла;
		КонецЦикла;

		__ТабРолиИПользователи.Индексы.Добавить("ИмяР");
		__ТабРолиИПользователи.Индексы.Добавить("ИмяП");
		АдресТаблицыРолиИПользователи = ПоместитьВоВременноеХранилище(__ТабРолиИПользователи, УникальныйИдентификатор);
	Иначе
		__ТабРолиИПользователи = ПолучитьИзВременногоХранилища(АдресТаблицыРолиИПользователи);
	КонецЕсли;
	Если ЭтоОбычныйРежим Тогда
		СтрукР = Новый Структура("ИмяР");
		СтрукП = Новый Структура("Имя");

		Для Каждого Стр Из ТабРоли Цикл
			СтрукР.ИмяР = Стр.Имя;
			Для Каждого СтрХ Из __ТабРолиИПользователи.НайтиСтроки(СтрукР) Цикл
				СтрукП.Имя = СтрХ.ИмяП;
				Если ТабПользователи.НайтиСтроки(СтрукП).Количество() = 0 Тогда
					НС = ТабПользователи.Добавить();
					НС.Имя = СтрХ.ИмяП;
					НС.ПолноеИмя = СтрХ.ПолноеИмяП;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;

		ТабПользователи.Сортировать("Имя");
	КонецЕсли;

	Если Не ЭтоОбычныйРежим Тогда
		Если ТипМД = "Роль" Тогда
			ИмяР = Сред(ПолноеИмя, СтрНайти(ПолноеИмя, ".") + 1);
			Для Каждого Стр Из __ТабРолиИПользователи.НайтиСтроки(Новый Структура("ИмяР", ИмяР)) Цикл
				НС = ТабПользователи.Добавить();
				НС.Имя = Стр.ИмяП;
				НС.ПолноеИмя = Стр.ПолноеИмяП;
			КонецЦикла;
			ТабПользователи.Сортировать("Имя");

		ИначеЕсли ТипМД = "Пользователь" Тогда
			ИмяП = Сред(ПолноеИмя, СтрНайти(ПолноеИмя, ".") + 1);
			Для Каждого Стр Из __ТабРолиИПользователи.НайтиСтроки(Новый Структура("ИмяП", ИмяП)) Цикл
				НС = ТабРоли.Добавить();
				НС.Имя = Стр.ИмяР;
			КонецЦикла;
			ТабРоли.Сортировать("Имя");
		КонецЕсли;
	КонецЕсли;

	СтрукРезультат.ЕстьДанные = Истина;
	СтрукРезультат.Роли = Новый Массив;
	СтрукРезультат.Пользователи = Новый Массив;

	Для Каждого Стр Из ТабРоли Цикл
		Струк = Новый Структура("Имя, Синоним");
		ЗаполнитьЗначенияСвойств(Струк, Стр);
		СтрукРезультат.Роли.Добавить(Струк);
	КонецЦикла;

	Для Каждого Стр Из ТабПользователи Цикл
		Струк = Новый Структура("Имя, ПолноеИмя");
		ЗаполнитьЗначенияСвойств(Струк, Стр);
		СтрукРезультат.Пользователи.Добавить(Струк);
	КонецЦикла;

	Возврат СтрукРезультат;
КонецФункции

&НаКлиенте
Процедура вЗаполнитьПроверяемыеПраваДоступа()
	Для Каждого Элем Из мОписаниеПравДоступа Цикл
		НС = ТабПроверяемыеПрава.Добавить();
		НС.ОбъектМД = Элем.Ключ;
		Поз = СтрНайти(Элем.Значение, ",");
		НС.Право = ?(Поз = 0, Элем.Значение, Лев(Элем.Значение, Поз - 1));
	КонецЦикла;

	ТабПроверяемыеПрава.Сортировать("ОбъектМД");
КонецПроцедуры

&НаКлиенте
Процедура ТабПроверяемыеПраваПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	ТекДанные = Элемент.ТекущиеДанные;
	Струк = Новый Структура(мОписаниеПравДоступа[ТекДанные.ОбъектМД]);

	ЭФ = Элементы.ТабПроверяемыеПраваПраво;
	ЭФ.СписокВыбора.Очистить();
	Для Каждого Элем Из Струк Цикл
		ЭФ.СписокВыбора.Добавить(Элем.Ключ);
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ТабРолиСДоступомВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ТекДанные = Элементы.ТабРолиСДоступом.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		пПолноеИмя = "Роль." + ТекДанные.Имя;
		СтрукПараметры = Новый Структура("ПолноеИмя, ПутьКФормам, _АдресаХранилищ, ОписаниеПравДоступа", пПолноеИмя,
			ПутьКФормам, _АдресаХранилищ, мОписаниеПравДоступа);
		СтрукПараметры.Вставить("НастройкиОбработки", вСформироватьСтруктуруНастроекФормыСвойствОбъекта());
		ОткрытьФорму(ПутьКФормам + "ФормаСвойств", СтрукПараметры, , пПолноеИмя, , , ,
			РежимОткрытияОкнаФормы.Независимый);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТабПользователиСДоступомВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ТекДанные = Элементы.ТабПользователиСДоступом.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		пИдентификаторПользователя = вПолучитьИдентификаторПользователя(ТекДанные.Имя);

		Если Не ПустаяСтрока(пИдентификаторПользователя) Тогда
			пСтрук = Новый Структура("РежимРаботы, ИдентификаторПользователяИБ", 0, пИдентификаторПользователя);
			ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", пСтрук, , , , , ,
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вСформироватьОписаниеПравДоступа()
	ПереченьА = "Чтение, Добавление, Изменение, Удаление, Просмотр, Редактирование";
	ПереченьБ = "Чтение, Изменение, Просмотр, Редактирование, УправлениеИтогами";

	мОписаниеПравДоступа = Новый Соответствие;
	мОписаниеПравДоступа.Вставить("Подсистема", "Просмотр");
	мОписаниеПравДоступа.Вставить("ПараметрСеанса", "Получение, Установка");
	мОписаниеПравДоступа.Вставить("ОбщийРеквизит", "Просмотр, Редактирование");
	мОписаниеПравДоступа.Вставить("ПланОбмена", ПереченьА);
	мОписаниеПравДоступа.Вставить("КритерийОтбора", "Просмотр");
	мОписаниеПравДоступа.Вставить("ОбщаяФорма", "Просмотр");
	мОписаниеПравДоступа.Вставить("ОбщаяКоманда", "Просмотр");
	мОписаниеПравДоступа.Вставить("ЧужаяКоманда", "Просмотр");
	мОписаниеПравДоступа.Вставить("WebСервис.Свойство", "Использование");
	мОписаниеПравДоступа.Вставить("HTTPСервис.Свойство", "Использование");
	мОписаниеПравДоступа.Вставить("Константа", "Чтение, Изменение, Просмотр, Редактирование");
	мОписаниеПравДоступа.Вставить("Справочник", ПереченьА);
	мОписаниеПравДоступа.Вставить("Документ", ПереченьА + ", Проведение, ОтменаПроведения");
	мОписаниеПравДоступа.Вставить("Последовательность", "Чтение, Изменение");
	мОписаниеПравДоступа.Вставить("ЖурналДокументов", "Чтение, Просмотр");
	мОписаниеПравДоступа.Вставить("Отчет", "Использование, Просмотр");
	мОписаниеПравДоступа.Вставить("Обработка", "Использование, Просмотр");
	мОписаниеПравДоступа.Вставить("ПланВидовХарактеристик", ПереченьА);
	мОписаниеПравДоступа.Вставить("ПланВидовРасчета", ПереченьА);
	мОписаниеПравДоступа.Вставить("ПланСчетов", ПереченьА);
	мОписаниеПравДоступа.Вставить("РегистрСведений", ПереченьБ);
	мОписаниеПравДоступа.Вставить("РегистрНакопления", ПереченьБ);
	мОписаниеПравДоступа.Вставить("РегистрБухгалтерии", ПереченьБ);
	мОписаниеПравДоступа.Вставить("РегистрРасчета", "Чтение, Изменение, Просмотр, Редактирование");
	мОписаниеПравДоступа.Вставить("БизнесПроцесс", ПереченьА + ", Старт");
	мОписаниеПравДоступа.Вставить("Задача", ПереченьА + ", Выполнение");

КонецПроцедуры

&НаКлиенте
Процедура кРассчитатьКоличествоОбъектов(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;

	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" Тогда
			Перечень = "Последовательность, ПланОбмена, Справочник, Документ, ЖурналДокументов, ПланВидовХарактеристик
					   |, ПланВидовРасчета, ПланСчетов, РегистрСведений, РегистрНакопления, РегистрБухгалтерии, РегистрРасчета, БизнесПроцесс, Задача";

			Струк = Новый Структура(Перечень);
			ТипМД = Лев(ТекДанные.ПолноеИмя, СтрНайти(ТекДанные.ПолноеИмя, ".") - 1);

			Если Не Струк.Свойство(ТипМД) Тогда
				Возврат;
			КонецЕсли;

			МассивОбъектов = Новый Массив;

			Струк = Новый Структура("ПолноеИмя, КоличествоОбъектов", ТекДанные.ПолноеИмя);
			МассивОбъектов.Добавить(Струк);

			РодительДЗ = ТекДанные.ПолучитьРодителя();

			РодительДЗ.КоличествоОбъектов = РодительДЗ.КоличествоОбъектов - ТекДанные.КоличествоОбъектов;

			вРассчитатьКоличествоОбъектов(МассивОбъектов);
			ТекДанные.КоличествоОбъектов = МассивОбъектов[0].КоличествоОбъектов;

			РодительДЗ.КоличествоОбъектов = РодительДЗ.КоличествоОбъектов + ТекДанные.КоличествоОбъектов;

		ИначеЕсли ТекДанные.ВидУзла = "РазделМД" Тогда
			СтрокиДЗ = ТекДанные.ПолучитьЭлементы();
			Если СтрокиДЗ.Количество() = 1 И ПустаяСтрока(СтрокиДЗ[0].ВидУзла) Тогда
				Возврат;
			КонецЕсли;

			Перечень = "Последовательности, ПланыОбмена, Справочники, Документы, ЖурналыДокументов, ПланыВидовХарактеристик
					   |, ПланыВидовРасчета, ПланыСчетов, РегистрыСведений, РегистрыНакопления, РегистрыБухгалтерии, РегистрыРасчета, БизнесПроцессы, Задачи";

			Струк = Новый Структура(Перечень);
			Поз = СтрНайти(ТекДанные.Имя, " ");
			Если Поз = 0 Тогда
				ИмяРаздела = ТекДанные.Имя;
			Иначе
				ИмяРаздела = Лев(ТекДанные.Имя, Поз - 1);
			КонецЕсли;

			Если Не Струк.Свойство(ИмяРаздела) Тогда
				Возврат;
			КонецЕсли;

			МассивОбъектов = Новый Массив;

			Для Каждого Стр Из СтрокиДЗ Цикл
				Если Стр.ВидУзла = "ОбъектМД" Тогда
					Струк = Новый Структура("Идентификатор, ПолноеИмя, КоличествоОбъектов",
						Стр.ПолучитьИдентификатор(), Стр.ПолноеИмя);
					МассивОбъектов.Добавить(Струк);
				КонецЕсли;
			КонецЦикла;

			вРассчитатьКоличествоОбъектов(МассивОбъектов);

			КоличествоОбъектов = 0;
			Для Каждого Стр Из МассивОбъектов Цикл
				СтрДЗ = ДеревоОбъектов.НайтиПоИдентификатору(Стр.Идентификатор);
				Если СтрДЗ <> Неопределено Тогда
					КоличествоОбъектов= КоличествоОбъектов + Стр.КоличествоОбъектов;
					СтрДЗ.КоличествоОбъектов = Стр.КоличествоОбъектов;
				КонецЕсли;
			КонецЦикла;
			ТекДанные.КоличествоОбъектов = КоличествоОбъектов;

		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вРассчитатьКоличествоОбъектов(МассивОбъектов)
	УстановитьПривилегированныйРежим(Истина);

	пИспользоватьПопытку = Не ПривилегированныйРежим() И Не вЕстьПраваАдминистратора();

	Для Каждого Элем Из МассивОбъектов Цикл
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	КОЛИЧЕСТВО(*) КАК КоличествоОбъектов
					   |ИЗ
					   |	" + Элем.ПолноеИмя + " КАК ТаблицаБД";

		Если пИспользоватьПопытку Тогда
			Попытка
				Выборка = Запрос.Выполнить().Выбрать();
				Элем.КоличествоОбъектов = ?(Выборка.Следующий(), Выборка.КоличествоОбъектов, 0);
			Исключение
				Элем.КоличествоОбъектов = 0;
			КонецПопытки;
		Иначе
			Выборка = Запрос.Выполнить().Выбрать();
			Элем.КоличествоОбъектов = ?(Выборка.Следующий(), Выборка.КоличествоОбъектов, 0);
		КонецЕсли;

	КонецЦикла;

	Возврат Истина;
КонецФункции
&НаКлиенте
Процедура _ПоказыватьСтандартныеНастройкиПриИзменении(Элемент)
	Элементы.СтрСтандартныеНастройки.Видимость = _ПоказыватьСтандартныеНастройки;
КонецПроцедуры

&НаКлиенте
Процедура _ПоказыватьТаблицыИИндексыБДПриИзменении(Элемент)
	Элементы.СтрСтруктураХранения.Видимость = _ПоказыватьТаблицыИИндексыБД;
КонецПроцедуры


// работа с разделом "Избранное..."
&НаКлиенте
Процедура _ДобавитьВИзбранное(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" Тогда
			СтрДЗ = ДеревоОбъектов.НайтиПоИдентификатору(мИдентификаторИзбранного).ПолучитьЭлементы().Добавить();
			ЗаполнитьЗначенияСвойств(СтрДЗ, ТекДанные);
			вВключитьФлагИзмененияНастроек();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _УдалитьИзИзбранного(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если Не ПустаяСтрока(ТекДанные.ПолноеИмя) Тогда
			СтрокиДЗ = ДеревоОбъектов.НайтиПоИдентификатору(мИдентификаторИзбранного).ПолучитьЭлементы();
			Для Каждого СтрДЗ Из СтрокиДЗ Цикл
				Если СтрДЗ.ПолноеИмя = ТекДанные.ПолноеИмя Тогда
					СтрокиДЗ.Удалить(СтрДЗ);
					вВключитьФлагИзмененияНастроек();
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вВключитьФлагИзмененияНастроек()
	_ДатаИзмененияНастроек = ТекущаяДата();
КонецПроцедуры

&НаКлиенте
Процедура _ОчиститьИзбранное(Команда)
	ДеревоОбъектов.НайтиПоИдентификатору(мИдентификаторИзбранного).ПолучитьЭлементы().Очистить();
	вВключитьФлагИзмененияНастроек();
КонецПроцедуры

&НаКлиенте
Процедура _УпорядочитьИзбранное(Команда)
	вУпорядочитьИзбранное(); // плохой способ

	Для Каждого СтрДЗ Из ДеревоОбъектов.ПолучитьЭлементы() Цикл
		Если СтрДЗ.ПолноеИмя = "Избранное" Тогда
			мИдентификаторИзбранного = СтрДЗ.ПолучитьИдентификатор();
			Прервать;
		КонецЕсли;
	КонецЦикла;

	вВключитьФлагИзмененияНастроек();
КонецПроцедуры

&НаСервере
Процедура вУпорядочитьИзбранное()
	пДерево = РеквизитФормыВЗначение("ДеревоОбъектов");
	пДерево.Строки.Найти("Избранное", "ПолноеИмя", Ложь).Строки.Сортировать("ПолноеИмя");
	ЗначениеВРеквизитФормы(пДерево, "ДеревоОбъектов");
КонецПроцедуры
&НаКлиенте
Процедура _ОткрытьРедакторОбъектов(Команда)
	СтрукПарам = Новый Структура;
	СтрукПарам.Вставить("мОбъектСсылка", Неопределено);
	ОткрытьФорму("Обработка.УИ_РедакторРеквизитовОбъекта.Форма", СтрукПарам, , ТекущаяДата());
КонецПроцедуры

&НаКлиенте
Процедура _ОбновитьНумерациюОбъектов(Команда)
	ТекДанные = Элементы.ДеревоОбъектов.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Если ТекДанные.ВидУзла = "ОбъектМД" Или ТекДанные.ВидУзла = "Конфигурация" Тогда
			Если Не вЕстьПраваАдминистратора() Тогда
				вПоказатьПредупреждение("Нет прав на выполнение операции!");
				Возврат;
			КонецЕсли;

			пТекст = ?(ТекДанные.ВидУзла = "Конфигурация", "Нумерация всех объектов будет обновлена. Продолжить?",
				"Нумерация обекта будет обновлена. Продолжить?");
			ПоказатьВопрос(Новый ОписаниеОповещения("вОбновитьНумерациюОбъектовОтвет", ЭтаФорма, ТекДанные.ПолноеИмя),
				пТекст, РежимДиалогаВопрос.ДаНетОтмена, 20);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _ОбновитьНумерациюВсехОбъектов(Команда)
	пТекст = "Нумерация всех объектов будет обновлена. Продолжить?";
	ПоказатьВопрос(Новый ОписаниеОповещения("вОбновитьНумерациюОбъектовОтвет", ЭтаФорма, "Конфигурация"), пТекст,
		РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура вОбновитьНумерациюОбъектовОтвет(РезультатВопроса, ДопПарам = Неопределено) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		вОбновитьНумерациюОбъектов(ДопПарам);
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вОбновитьНумерациюОбъектов(Знач ПолноеИмя)
	Если ПолноеИмя = "Конфигурация" Тогда
		Попытка
			ОбновитьНумерациюОбъектов();
		Исключение
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;

	ИначеЕсли СтрНайти(ПолноеИмя, ".") <> 0 Тогда
		ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);

		Если ОбъектМД <> Неопределено Тогда
			Попытка
				ОбновитьНумерациюОбъектов(ОбъектМД);
			Исключение
				Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;

	Возврат Истина;
КонецФункции

// работа со структурой хранения базы данных (таблицы и индексы)
&НаКлиенте
Процедура _ЗаполнитьСХ(Команда)
	_СХИндексы.Очистить();
	_СХТаблицы.Очистить();

	вЗаполнитьСХ();

	Элементы.СтрИндексы.Заголовок = "Все индексы БД (" + _СХИндексы.Количество() + ")";
	Элементы.СтрТаблицы.Заголовок = "Все таблицы БД (" + _СХТаблицы.Количество() + ")";
КонецПроцедуры

&НаСервере
Процедура вЗаполнитьСХ()
	ТабРезультат = ПолучитьСтруктуруХраненияБазыДанных( , Не _ПоказыватьСтруктуруХраненияВТерминах1С);

	Для Каждого Стр Из ТабРезультат Цикл
		НС = _СХТаблицы.Добавить();
		ЗаполнитьЗначенияСвойств(НС, Стр);

		Если НС.ИмяТаблицы = "" Тогда
			НС.ИмяТаблицы = "<не задано>";
		КонецЕсли;
		Если НС.Метаданные = "" Тогда
			НС.Метаданные = "<не задано>";
		КонецЕсли;

		Для Каждого СтрХ Из Стр.Индексы Цикл
			НС = _СХИндексы.Добавить();
			НС.ИмяИндексаХранения = СтрХ.ИмяИндексаХранения;
			ЗаполнитьЗначенияСвойств(НС, Стр, "ИмяТаблицыХранения, Метаданные");
			Если НС.Метаданные = "" Тогда
				НС.Метаданные = "<не задано>";
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура _СХТаблицыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	кПоказатьСвойстваОбъекта(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура _СХИндексыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	кПоказатьСвойстваОбъекта(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура _ПерейтиКТаблицеОтИндекса(Команда)
	ТекДанные = Элементы._СХИндексы.ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		Массив = _СХТаблицы.НайтиСтроки(Новый Структура("ИмяТаблицыХранения", ТекДанные.ИмяТаблицыХранения));
		Если Массив.Количество() <> 0 Тогда
			Строка = Массив[0].ПолучитьИдентификатор();
			ТекСтрока = _СХТаблицы.НайтиПоИдентификатору(Строка);
			Если ТекСтрока <> Неопределено Тогда
				Элементы._СХТаблицы.ТекущаяСтрока = Строка;
				Элементы.ГруппаТаблицыИИндексы.ТекущаяСтраница = Элементы.СтрТаблицы;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры


// работа с пользователями ИБ
&НаКлиенте
Процедура _ЗаполнитьСписокПользователейИБ(Команда)
	_СписокПользователейИБ.Очистить();

	пПереченьПолей = "АутентификацияOpenID, АутентификацияОС, АутентификацияСтандартная, Имя, ПарольУстановлен,
					 |ПоказыватьВСпискеВыбора, ПолноеИмя, ПользовательОС, РежимЗапуска, УникальныйИдентификатор,
					 |ПереченьРолей";

	пМассив = вПолучитьПользователейИБ(пПереченьПолей, _ПоказыватьСписокРолейПользователя);
	Для Каждого Элем Из пМассив Цикл
		ЗаполнитьЗначенияСвойств(_СписокПользователейИБ.Добавить(), Элем);
	КонецЦикла;

	_СписокПользователейИБ.Сортировать("Имя");

	Если Элементы._СписокПользователейИБПереченьРолей.Видимость <> _ПоказыватьСписокРолейПользователя Тогда
		Элементы._СписокПользователейИБПереченьРолей.Видимость = _ПоказыватьСписокРолейПользователя;
	КонецЕсли;

	Элементы.СтрПользователиИБ.Заголовок = "Пользователи (" + пМассив.Количество() + ")";
КонецПроцедуры

&НаСервереБезКонтекста
Функция вПолучитьПользователейИБ(Знач пПереченьПолей, Знач пЗаполнятьПереченьРолнй = Ложь)
	пРезультат = Новый Массив;

	Для Каждого Элем Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
		пСтрук = Новый Структура(пПереченьПолей);
		ЗаполнитьЗначенияСвойств(пСтрук, Элем);

		Если пЗаполнятьПереченьРолнй Тогда
			пСписокРолей = Новый СписокЗначений;
			Для Каждого пРоль Из Элем.Роли Цикл
				пСписокРолей.Добавить(пРоль.Имя);
			КонецЦикла;
			пСписокРолей.СортироватьПоЗначению();

			пПереченьРолей = "";
			Для Каждого пРоль Из пСписокРолей Цикл
				пПереченьРолей = пПереченьРолей + ", " + пРоль.Значение;
			КонецЦикла;
			пСтрук.ПереченьРолей = Сред(пПереченьРолей, 2);
		КонецЕсли;

		пРезультат.Добавить(пСтрук);
	КонецЦикла;

	Возврат пРезультат;
КонецФункции

&НаКлиенте
Процедура _СписокПользователейИБВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	ТекДанные = _СписокПользователейИБ.НайтиПоИдентификатору(ВыбраннаяСтрока);
	Если ТекДанные <> Неопределено Тогда
		пСтрук = Новый Структура("РежимРаботы, ИдентификаторПользователяИБ", 0, ТекДанные.УникальныйИдентификатор);
		ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", пСтрук, , , , , ,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _СписокПользователейИБПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	Отказ = Истина;

	Если Копирование Тогда
		ТекДанные = Элемент.ТекущиеДанные;
		Если ТекДанные <> Неопределено Тогда
			пСтрук = Новый Структура("РежимРаботы, ИдентификаторПользователяИБ", 2, ТекДанные.УникальныйИдентификатор);
			ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", пСтрук, , , , , ,
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		КонецЕсли;
	Иначе
		пСтрук = Новый Структура("РежимРаботы", 1);
		ОткрытьФорму(ПутьКФормам + "ФормаПользовательИБ", пСтрук, , , , , ,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _СписокПользователейИБПередУдалением(Элемент, Отказ)
	Отказ = Истина;

	пВыделенныеСтроки = Элемент.ВыделенныеСтроки;
	пЧисло = пВыделенныеСтроки.Количество();

	Если пЧисло = 0 Тогда
		Возврат;
	ИначеЕсли пЧисло = 1 Тогда
		пТекст = СтрШаблон("Пользователь ""%1"" будет удален из информационной базы!
						   |Продолжить?", _СписокПользователейИБ.НайтиПоИдентификатору(пВыделенныеСтроки[0]).Имя);
	Иначе
		пТекст = СтрШаблон("Отмеченные пользователи (%1 шт) будут удалены из информационной базы!
						   |Продолжить?", пЧисло);
	КонецЕсли;

	вПоказатьВопрос(пТекст, "вУдалитьПользователейИБОтвет", пВыделенныеСтроки);
КонецПроцедуры

&НаКлиенте
Процедура вУдалитьПользователейИБОтвет(Ответ, пВыделенныеСтроки) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		пМассив = Новый Массив;
		Для Каждого Стр Из пВыделенныеСтроки Цикл
			ТекДанные = _СписокПользователейИБ.НайтиПоИдентификатору(Стр);
			Если ТекДанные <> Неопределено Тогда
				пМассив.Добавить(ТекДанные.УникальныйИдентификатор);
			КонецЕсли;
		КонецЦикла;

		Если пМассив.Количество() <> 0 Тогда
			пМассивУдаленных = вУдалитьПользователейИБ(пМассив);
			Для Каждого Элем Из пМассивУдаленных Цикл
				Для Каждого СтрХ Из _СписокПользователейИБ.НайтиСтроки(Новый Структура("УникальныйИдентификатор",
					Элем)) Цикл
					_СписокПользователейИБ.Удалить(СтрХ);
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вУдалитьПользователейИБ(Знач пМассивИдентификаторов)
	пРезультат = Новый Массив;

	пТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

	Для Каждого Элем Из пМассивИдентификаторов Цикл
		Попытка
			пUUID = Новый УникальныйИдентификатор(Элем);

			пПользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(пUUID);
			Если пПользователь = Неопределено Или (пТекПользователь <> Неопределено
				И пТекПользователь.УникальныйИдентификатор = пUUID) Тогда
				Продолжить;
			КонецЕсли;

			пПользователь.Удалить();
			пРезультат.Добавить(Элем);
		Исключение
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;
	КонецЦикла;

	Возврат пРезультат;
КонецФункции


// работа с сеансами
&НаКлиенте
Процедура _УстановитьБлокуировкуСеансов(Команда)
	ОткрытьФорму(ПутьКФормам + "ФормаБлокировкиСеансов", , ЭтаФорма, , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура _ЗаполнитьСписокСеансов(Команда)
	_СписокСеансов.Очистить();

	пПереченьПолей = "ТекущийСеанс, ИмяКомпьютера, ИмяПриложения, ПредставлениеПриложения, НачалоСеанса, НомерСеанса, НомерСоединения, Пользователь, ИдентификаторПользователяИБ,
					 |ИмяМетода, Ключ, Начало, Конец, Наименование, Расположение, РегламентноеЗадание, Состояние, ИдентификаторФоновогоЗадания";

	пМассив = вПолучитьСенансы(пПереченьПолей);

	Для Каждого Элем Из пМассив Цикл
		ЗаполнитьЗначенияСвойств(_СписокСеансов.Добавить(), Элем);
	КонецЦикла;

	_СписокСеансов.Сортировать("НачалоСеанса");

	Элементы.ГруппаСеансы.Заголовок = "Сеансы информационной базы (" + пМассив.Количество() + ")";
КонецПроцедуры

&НаСервереБезКонтекста
Функция вПолучитьСенансы(Знач пПереченьПолей)
	УстановитьПривилегированныйРежим(Истина);

	пТекНомерСеанса = НомерСеансаИнформационнойБазы();

	пРезультат = Новый Массив;

	Для Каждого Элем Из ПолучитьСеансыИнформационнойБазы() Цикл
		пСтрук = Новый Структура(пПереченьПолей);
		ЗаполнитьЗначенияСвойств(пСтрук, Элем);

		пСтрук.ТекущийСеанс = (Элем.НомерСеанса = пТекНомерСеанса);

		пСтрук.ПредставлениеПриложения = ПредставлениеПриложения(пСтрук.ИмяПриложения);

		пСтрук.Пользователь = Строка(пСтрук.Пользователь);

		Если Элем.Пользователь <> Неопределено Тогда
			пСтрук.ИдентификаторПользователяИБ = Строка(Элем.Пользователь.УникальныйИдентификатор);
		КонецЕсли;

		пФоновоеЗадание = Элем.ПолучитьФоновоеЗадание();
		Если пФоновоеЗадание <> Неопределено Тогда
			ЗаполнитьЗначенияСвойств(пСтрук, пФоновоеЗадание);
			пСтрук.Состояние = Строка(пФоновоеЗадание.Состояние);
			пСтрук.РегламентноеЗадание = Строка(пФоновоеЗадание.РегламентноеЗадание);
			пСтрук.ИдентификаторФоновогоЗадания = Строка(пФоновоеЗадание.УникальныйИдентификатор);
		КонецЕсли;

		пРезультат.Добавить(пСтрук);
	КонецЦикла;

	Возврат пРезультат;
КонецФункции

&НаКлиенте
Процедура _ЗаполнитьСписокСоединений(Команда)
	_СписокСоединений.Очистить();

	пПереченьПолей = "ТекущееСоединение, Активность, ИмяКомпьютера, ИмяПриложения, ПредставлениеПриложения, НачалоСоединения, НомерСеанса, НомерСоединения, Пользователь, ИдентификаторПользователяИБ";

	пМассив = вПолучитьСоединения(пПереченьПолей);

	Для Каждого Элем Из пМассив Цикл
		ЗаполнитьЗначенияСвойств(_СписокСоединений.Добавить(), Элем);
	КонецЦикла;

	_СписокСоединений.Сортировать("НачалоСоединения");

	Элементы.ГруппаСоединения.Заголовок = "Соединения информационной базы (" + пМассив.Количество() + ")";
КонецПроцедуры

&НаСервереБезКонтекста
Функция вПолучитьСоединения(Знач пПереченьПолей)
	УстановитьПривилегированныйРежим(Истина);

	пТекНомерСоединения = НомерСоединенияИнформационнойБазы();

	пРезультат = Новый Массив;

	Для Каждого Элем Из ПолучитьСоединенияИнформационнойБазы() Цикл
		пСтрук = Новый Структура(пПереченьПолей);
		ЗаполнитьЗначенияСвойств(пСтрук, Элем);

		пСтрук.ТекущееСоединение = (Элем.НомерСоединения = пТекНомерСоединения);

		пСтрук.Активность = ЗначениеЗаполнено(Элем.НомерСеанса);

		пСтрук.ПредставлениеПриложения = ПредставлениеПриложения(пСтрук.ИмяПриложения);

		пСтрук.Пользователь = Строка(пСтрук.Пользователь);

		Если Элем.Пользователь <> Неопределено Тогда
			пСтрук.ИдентификаторПользователяИБ = Строка(Элем.Пользователь.УникальныйИдентификатор);
		КонецЕсли;

		пРезультат.Добавить(пСтрук);
	КонецЦикла;

	Возврат пРезультат;
КонецФункции
&НаКлиенте
Процедура _ЗавершитьСеансы(Команда)
	пВыделенныеСтроки = Элементы._СписокСеансов.ВыделенныеСтроки;
	Если пВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	пМассивСеансов = Новый Массив;
	Для Каждого Элем Из пВыделенныеСтроки Цикл
		Стр = _СписокСеансов.НайтиПоИдентификатору(Элем);
		Если Не Стр.ТекущийСеанс Тогда
			пМассивСеансов.Добавить(Стр.НомерСеанса);
		КонецЕсли;
	КонецЦикла;

	Если пМассивСеансов.Количество() = 0 Тогда
		вПоказатьПредупреждение("Невозможно завершить текущий сеанс!
								|Для выхода из программы можно закрыть главное окно программы.");
		Возврат;
	КонецЕсли;

	пТекст = СтрШаблон("Отмеченные сеансы (%1 шт) будут завершены.
					   |Продолжить?", пМассивСеансов.Количество());

	вПоказатьВопрос(пТекст, "вЗавершитьСеансыОтвет", пМассивСеансов);
КонецПроцедуры

&НаКлиенте
Процедура вЗавершитьСеансыОтвет(Ответ, пМассивСеансов) Экспорт
	Если Ответ = КодВозвратаДиалога.Да Тогда
		Если мПараметрыКластера1С = Неопределено Тогда
			мПараметрыКластера1С = вПолучитьПараметрыКластера1С();
		КонецЕсли;

		Если мПараметрыКластера1С.ФайловыйВариантИБ Тогда
			Элементы._СписокСеансов_ЗавершитьСеансы.Доступность = Ложь;
			Элементы.ГруппаАдминистраторКластера.ТолькоПросмотр = Истина;
			вПоказатьПредупреждение("Завершение сеансов реализовано только для клиент-серверного варианта!");
			Возврат;
		КонецЕсли;

		Попытка
			вЗавершитьСеансы(пМассивСеансов);
		Исключение
			Сообщить(вСформироватьОписаниеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;

		_ЗаполнитьСписокСеансов(Неопределено);
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция вСформироватьОписаниеОшибки(Знач пИнфоОбОшибке)
	пТекст = пИнфоОбОшибке.Описание;

	Пока Истина Цикл
		Если пИнфоОбОшибке.Причина <> Неопределено Тогда
			пТекст = пТекст + "
							  |" + пИнфоОбОшибке.Причина.Описание;
			пИнфоОбОшибке = пИнфоОбОшибке.Причина;
		Иначе
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат пТекст;
КонецФункции
&НаКлиенте
Процедура вЗавершитьСеансы(пМассивСеансов)
	COMСоединитель = Новый COMОбъект(мПараметрыКластера1С.ИмяCOMСоединителя, мПараметрыКластера1С.СерверCOMСоединителя);

	пСоединениеСАгентомСервера = вСоединениеСАгентомСервера(
		COMСоединитель, мПараметрыКластера1С.АдресАгентаСервера, мПараметрыКластера1С.ПортАгентаСервера);

	пКластер = вПолучитьКластер(
		пСоединениеСАгентомСервера, мПараметрыКластера1С.ПортКластера, _ИмяАдминистратораКластера, ?(ПустаяСтрока(
		_ИмяАдминистратораКластера), "", _ПарольАдминистратораКластера));

	пСеансыКУдалению = Новый Массив;

	Для Каждого Сеанс Из пСоединениеСАгентомСервера.GetSessions(пКластер).Выгрузить() Цикл
		Если пМассивСеансов.Найти(Сеанс.SessionID) <> Неопределено Тогда
			пСеансыКУдалению.Добавить(Сеанс);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Сеанс Из пСеансыКУдалению Цикл
		ОбработкаПрерыванияПользователя();

		Попытка
			пСоединениеСАгентомСервера.TerminateSession(пКластер, Сеанс);
		Исключение
		КонецПопытки;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Функция вСоединениеСАгентомСервера(COMСоединитель, Знач АдресАгентаСервера, Знач ПортАгентаСервера)

	пСтрокаСоединенияСАгентомСервера = "tcp://" + АдресАгентаСервера + ":" + Формат(ПортАгентаСервера, "ЧГ=0");
	пСоединениеСАгентомСервера = COMСоединитель.ConnectAgent(пСтрокаСоединенияСАгентомСервера);

	Возврат пСоединениеСАгентомСервера;

КонецФункции

&НаКлиенте
Функция вПолучитьКластер(СоединениеСАгентомСервера, Знач ПортКластера, Знач ИмяАдминистратораКластера,
	Знач ПарольАдминистратораКластера)

	Для Каждого Кластер Из СоединениеСАгентомСервера.GetClusters() Цикл

		Если Кластер.MainPort = ПортКластера Тогда

			СоединениеСАгентомСервера.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);

			Возврат Кластер;

		КонецЕсли;

	КонецЦикла;

	ВызватьИсключение СтрШаблон("На рабочем сервере %1 не найден кластер %2", СоединениеСАгентомСервера.ConnectionString,
		ПортКластера);

КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьПараметрыКластера1С()
	пРезультат = Новый Структура;

	пСистемнаяИнфо = Новый СистемнаяИнформация;
	пСтрокаСоединения = СтрокаСоединенияИнформационнойБазы();

	пРезультат.Вставить("ФайловыйВариантИБ", (Найти(Врег(пСтрокаСоединения), "FILE=") = 1));
	пРезультат.Вставить("СерверCOMСоединителя", "");
	пРезультат.Вставить("ПортАгентаСервера", 1540);
	пРезультат.Вставить("ПортКластера", 1541);
	пРезультат.Вставить("АдресАгентаСервера", "LocalHost");
	пРезультат.Вставить("ИмяАдминистратораКластера", "");
	пРезультат.Вставить("ПарольАдминистратораКластера", "");
	пРезультат.Вставить("ИмяВКластере", "");
	пРезультат.Вставить("ТипПодключения", "COM");
	пРезультат.Вставить("ИмяCOMСоединителя", "V83.COMConnector");
	пРезультат.Вставить("ИмяАдминистратораИнформационнойБазы", ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
	пРезультат.Вставить("ПарольАдминистратораИнформационнойБазы", "");
	пРезультат.Вставить("Платформа1С", "83");

	пМассивСтр = СтрРазделить(пСтрокаСоединения, ";", Ложь);

	пЗначение = СтрЗаменить(вЗначениеКлючаСтроки(пМассивСтр, "Srvr"), """", "");
	Поз = Найти(пЗначение, ":");
	Если Поз <> 0 Тогда
		пРезультат.Вставить("АдресАгентаСервера", СокрЛП(Сред(пЗначение, 1, Поз - 1)));
		пРезультат.Вставить("ПортКластера", Число(Сред(пЗначение, Поз + 1)));
	Иначе
		пРезультат.Вставить("АдресАгентаСервера", пЗначение);
		пРезультат.Вставить("ПортКластера", 1541);
	КонецЕсли;
	пРезультат.ПортАгентаСервера = пРезультат.ПортКластера - 1;

	пРезультат.Вставить("ИмяВКластере", СтрЗаменить(вЗначениеКлючаСтроки(пМассивСтр, "Ref"), """", ""));

	пРезультат.Вставить("ВерсияПриложения", пСистемнаяИнфо.ВерсияПриложения);
	пРезультат.Вставить("КаталогПрограммы", КаталогПрограммы());

	Если Найти(пРезультат.ВерсияПриложения, "8.4.") = 1 Тогда
		пРезультат.Вставить("ИмяCOMСоединителя", "V84.COMConnector");
		пРезультат.Вставить("Платформа1С", "84");
	КонецЕсли;

	Возврат пРезультат;
КонецФункции

&НаСервереБезКонтекста
Функция вЗначениеКлючаСтроки(МассивСтрок, Ключ, ЗначениеПоУмолчанию = "") Экспорт
	КлючВР = ВРег(Ключ) + "=";
	Для Каждого Стр Из МассивСтрок Цикл
		пЗначение = СокрЛП(Стр);
		Если Найти(ВРег(пЗначение), КлючВР) = 1 Тогда
			Возврат Сред(пЗначение, СтрДлина(КлючВР) + 1);
		КонецЕсли;
	КонецЦикла;

	Возврат ЗначениеПоУмолчанию;
КонецФункции


// РАСШИРЕНИЯ КОНФИГУРАЦИИ
&НаКлиенте
Процедура _ЗаполнитьСписокРасширений(Команда)
	_СписокРасширений.Очистить();

	пМассив = вПолучитьСписокРасширений();

	Для Каждого Элем Из пМассив Цикл
		ЗаполнитьЗначенияСвойств(_СписокРасширений.Добавить(), Элем);
	КонецЦикла;
	
	//вЗаполнитьСписокРасширений();

	_СписокРасширений.Сортировать("Имя");

	Элементы.СтрРасширенияКонфигурации.Заголовок = "Расширения конфигурации (" + _СписокРасширений.Количество() + ")";
КонецПроцедуры

&НаСервере
Процедура вЗаполнитьСписокРасширений()
	_СписокРасширений.Очистить();

	пМассив = РасширенияКонфигурации.Получить();

	Для Каждого Элем Из пМассив Цикл
		НС = _СписокРасширений.Добавить();
		ЗаполнитьЗначенияСвойств(НС, Элем);
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция вСформироватьСтруктуруСвойствРасширения(пРежим = 0)
	пСтрук = Новый Структура("Активно, БезопасныйРежим, Версия, ЗащитаОтОпасныхДействий, Имя, Назначение, ОбластьДействия, Синоним, УникальныйИдентификатор, ХешСумма");

	Если пРежим = 1 Тогда
		Для Каждого Элем Из пСтрук Цикл
			пСтрук[Элем.Ключ] = -1;
		КонецЦикла;
	КонецЕсли;

	Возврат пСтрук;
КонецФункции

&НаСервереБезКонтекста
Функция вПроверитьНаличиеТипа(Знач пИмяТипа)
	Попытка
		пТип = Тип(пИмяТипа);
	Исключение
		Возврат Ложь;
	КонецПопытки;

	Возврат Истина;
КонецФункции
&НаСервереБезКонтекста
Функция вПолучитьСписокРасширений()
	пРезультат = Новый Массив;

	пМассив = РасширенияКонфигурации.Получить();

	Для Каждого Элем Из пМассив Цикл
		пСтрук = вСформироватьСтруктуруСвойствРасширения(1);
		ЗаполнитьЗначенияСвойств(пСтрук, Элем);

		Если пСтрук.ЗащитаОтОпасныхДействий = -1 Тогда
			пСтрук.ЗащитаОтОпасныхДействий = Неопределено;
		Иначе
			пСтрук.ЗащитаОтОпасныхДействий = пСтрук.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях;
		КонецЕсли;

		Если пСтрук.ОбластьДействия = -1 Тогда
			пСтрук.ОбластьДействия = Неопределено;
		Иначе
			пСтрук.ОбластьДействия = Строка(пСтрук.ОбластьДействия);
		КонецЕсли;

		Если пСтрук.Назначение = -1 Тогда
			пСтрук.Назначение = Неопределено;
		Иначе
			пСтрук.Назначение = Строка(пСтрук.Назначение);
		КонецЕсли;

		пРезультат.Добавить(пСтрук);
	КонецЦикла;

	Возврат пРезультат;
КонецФункции

&НаКлиенте
Процедура ЗапускПодПользователемКонфигуратор(Команда)
	ТекДанные=Элементы._СписокПользователейИБ.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ЗапуститьСеанс1С(1, ТекДанные.Имя, Истина,
		ВремяОжиданияЗапускаПодПользователемПередВосстановлениемПароля);
КонецПроцедуры

&НаКлиенте
Процедура ЗапускПодПользователемТолстыйКлиентОбычноеПриложение(Команда)
	ТекДанные=Элементы._СписокПользователейИБ.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ЗапуститьСеанс1С(2, ТекДанные.Имя, Истина,
		ВремяОжиданияЗапускаПодПользователемПередВосстановлениемПароля);
КонецПроцедуры

&НаКлиенте
Процедура ЗапускПодПользователемТолстыйКлиент(Команда)
	ТекДанные=Элементы._СписокПользователейИБ.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ЗапуститьСеанс1С(3, ТекДанные.Имя, Истина,
		ВремяОжиданияЗапускаПодПользователемПередВосстановлениемПароля);
КонецПроцедуры

&НаКлиенте
Процедура ЗапускПодПользователемТонкийКлиент(Команда)
	ТекДанные=Элементы._СписокПользователейИБ.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.ЗапуститьСеанс1С(4, ТекДанные.Имя, Истина,
		ВремяОжиданияЗапускаПодПользователемПередВосстановлениемПароля);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры


